/ Hex Artifact Content
Login

Artifact 24dd5e463f527427dd55fccc338c62260ae09b3a:


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 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
4dc0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 44 55   SQLITE_EXTRA_DU
4dd0: 52 41 42 4c 45 20 6f 70 74 69 6f 6e 20 69 73 20  RABLE option is 
4de0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  set at compile-t
4df0: 69 6d 65 2c 20 74 68 65 6e 0a 2a 2a 20 53 51 4c  ime, then.** SQL
4e00: 69 74 65 20 77 69 6c 6c 20 64 6f 20 65 78 74 72  ite will do extr
4e10: 61 20 66 73 79 6e 63 28 29 20 6f 70 65 72 61 74  a fsync() operat
4e20: 69 6f 6e 73 20 77 68 65 6e 20 73 79 6e 63 68 72  ions when synchr
4e30: 6f 6e 6f 75 73 3d 3d 46 55 4c 4c 20 74 6f 20 68  onous==FULL to h
4e40: 65 6c 70 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68  elp.** ensure th
4e50: 61 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  at transactions 
4e60: 61 72 65 20 64 75 72 61 62 6c 65 20 61 63 72 6f  are durable acro
4e70: 73 73 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ss a power failu
4e80: 72 65 2e 20 20 4d 6f 73 74 0a 2a 2a 20 61 70 70  re.  Most.** app
4e90: 6c 69 63 61 74 69 6f 6e 73 20 61 72 65 20 68 61  lications are ha
4ea0: 70 70 79 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ppy as long as t
4eb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
4ec0: 63 6f 6e 73 69 73 74 65 6e 74 20 61 63 72 6f 73  consistent acros
4ed0: 73 0a 2a 2a 20 61 20 70 6f 77 65 72 20 66 61 69  s.** a power fai
4ee0: 6c 75 72 65 2c 20 61 6e 64 20 61 72 65 20 70 65  lure, and are pe
4ef0: 72 66 65 63 74 6c 79 20 77 69 6c 6c 69 6e 67 20  rfectly willing 
4f00: 74 6f 20 6c 6f 73 65 20 74 68 65 20 6c 61 73 74  to lose the last
4f10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
4f20: 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
4f30: 74 68 65 20 65 78 74 72 61 20 70 65 72 66 6f 72  the extra perfor
4f40: 6d 61 6e 63 65 20 6f 66 20 61 76 6f 69 64 69 6e  mance of avoidin
4f50: 67 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e 63  g directory sync
4f60: 73 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 74 68 65  s..** And so the
4f70: 20 64 65 66 61 75 6c 74 20 53 51 4c 49 54 45 5f   default SQLITE_
4f80: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 20 73 65  EXTRA_DURABLE se
4f90: 74 74 69 6e 67 20 69 73 20 6f 66 66 2e 0a 2a 2f  tting is off..*/
4fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fb0: 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a 23 20  EXTRA_DURABLE.# 
4fc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 58  define SQLITE_EX
4fd0: 54 52 41 5f 44 55 52 41 42 4c 45 20 30 0a 23 65  TRA_DURABLE 0.#e
4fe0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  ndif.../*.** An 
4ff0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
5000: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
5010: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
5020: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
5030: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
5040: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
5050: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
5060: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
5070: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
5080: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
5090: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
50a0: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
50b0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
50c0: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
50d0: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
50e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
50f0: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
5100: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
5110: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
5120: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
5130: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
5140: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
5150: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
5160: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
5170: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
5180: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
5190: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
51a0: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
51b0: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
51c0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
51d0: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
51e0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
51f0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
5200: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
5210: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
5220: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
5230: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
5240: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
5250: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
5260: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
5270: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
5280: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
5290: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
52a0: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
52b0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
52c0: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
52d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52e0: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
52f0: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
5300: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
5310: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5320: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
5330: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
5340: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
5350: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
5360: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
5370: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
5380: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
5390: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
53a0: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
53b0: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
53c0: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53e0: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
53f0: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
5400: 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
5410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
5420: 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b  .  u32 aWalData[
5430: 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44  WAL_SAVEPOINT_ND
5440: 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  ATA];        /* 
5450: 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f  WAL savepoint co
5460: 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66 0a  ntext */.#endif.
5470: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20 6f  };../*.** Bits o
5480: 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e 6f  f the Pager.doNo
5490: 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53 65  tSpill flag.  Se
54a0: 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72 69  e further descri
54b0: 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f 0a  ption below..*/.
54c0: 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41  #define SPILLFLA
54d0: 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30 78  G_OFF         0x
54e0: 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69 6c  01 /* Never spil
54f0: 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76 69  l cache.  Set vi
5500: 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65 66  a pragma */.#def
5510: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  ine SPILLFLAG_RO
5520: 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20 2f  LLBACK    0x02 /
5530: 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69 6e  * Current rollin
5540: 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f  g back, so do no
5550: 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66 69  t spill */.#defi
5560: 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53  ne SPILLFLAG_NOS
5570: 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f 2a  YNC      0x04 /*
5580: 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62 75   Spill is ok, bu
5590: 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a 2f  t do not sync */
55a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e 20  ../*.** An open 
55b0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
55c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
55d0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
55e0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
55f0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
5600: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
5610: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
5620: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5630: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5640: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5650: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5660: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5670: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5680: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5690: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
56a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
56b0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
56c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
56d0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
56e0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
56f0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
5700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5710: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
5720: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5730: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5740: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5750: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5760: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5770: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5780: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5790: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
57a0: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
57b0: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
57c0: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
57d0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
57e0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
57f0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
5800: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
5810: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
5820: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5830: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5840: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5850: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5860: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5870: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5880: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5890: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
58a0: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
58b0: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
58c0: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
58d0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
58e0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
58f0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
5900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
5910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
5920: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5930: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5940: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5950: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5960: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5970: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5990: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
59a0: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
59b0: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
59c0: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
59d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
59e0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
59f0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
5a00: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
5a10: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
5a20: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5a30: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5a40: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5a50: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5a60: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5a70: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5a80: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5a90: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5aa0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5ab0: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5ac0: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
5ad0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
5ae0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
5af0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
5b00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
5b10: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
5b20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5b30: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5b40: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5b50: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5b60: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5b70: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5b80: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5b90: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5ba0: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5bb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5bc0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
5bd0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
5be0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
5bf0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
5c00: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
5c10: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
5c20: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5c30: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5c40: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5c50: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5c60: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5c70: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5c80: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5c90: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5ca0: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5cb0: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5cc0: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5cd0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ce0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5cf0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5d00: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5d10: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5d20: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5d30: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5d40: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5d50: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5d60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5d70: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5d80: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5d90: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5da0: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5db0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5dc0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5dd0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5de0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5df0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5e00: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5e10: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5e20: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5e30: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5e40: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5e50: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5e60: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5e70: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5e80: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5e90: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5ea0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5eb0: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5ec0: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ed0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5ee0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5ef0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5f00: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5f10: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5f20: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5f30: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5f40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5f50: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5f60: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5f70: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5f80: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5f90: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5fa0: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5fb0: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5fc0: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5fd0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5fe0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5ff0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
6000: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
6010: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
6020: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
6030: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
6040: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
6050: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
6060: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
6070: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
6080: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
6090: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
60a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
60b0: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
60c0: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
60d0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
60e0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
60f0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
6100: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
6110: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
6120: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
6130: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
6140: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
6150: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
6160: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
6170: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
6180: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
6190: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
61a0: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
61b0: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
61c0: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
61d0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
61e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
61f0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
6200: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
6210: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
6220: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6230: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6240: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6250: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6260: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6270: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6280: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6290: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
62a0: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
62b0: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
62c0: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
62d0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
62e0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
62f0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
6300: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6310: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6320: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6330: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6340: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6350: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6360: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6370: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6380: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6390: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
63a0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
63b0: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
63c0: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
63d0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
63e0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
63f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6400: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
6410: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
6420: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6430: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6440: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6450: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6460: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6470: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6480: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6490: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
64a0: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
64b0: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
64c0: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 0a  e database from.
64d0: 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73 73  **   pagerStress
64e0: 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c  () is permitted,
64f0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
6500: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
6510: 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73 20   not..**   This 
6520: 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 73  flag is set by s
6530: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6540: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6550: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6560: 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72 67  ize.**   is larg
6570: 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61  er than the data
6580: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6590: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
65a0: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
65b0: 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70 70  c.**   from happ
65c0: 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65 6e  ening in between
65d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67   the journalling
65e0: 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f 6e   of two pages on
65f0: 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
6600: 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d  . .**.** subjInM
6610: 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68  emory.**.**   Th
6620: 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20  is is a boolean 
6630: 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75  variable. If tru
6640: 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  e, then any requ
6650: 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  ired sub-journal
6660: 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20  .**   is opened 
6670: 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
6680: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6690: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d   false, then in-
66a0: 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d  memory.**   sub-
66b0: 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c  journals are onl
66c0: 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  y used for in-me
66d0: 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  mory pager files
66e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76  ..**.**   This v
66f0: 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61 74  ariable is updat
6700: 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72 20  ed by the upper 
6710: 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65 20  layer each time 
6720: 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69 74  a new .**   writ
6730: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6740: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 64   opened..**.** d
6750: 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a  bSize, dbOrigSiz
6760: 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  e, dbFileSize.**
6770: 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20 64  .**   Variable d
6780: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
67a0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
67b0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 49  ase file..**   I
67c0: 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50 41  t is valid in PA
67d0: 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20 68  GER_READER and h
67e0: 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61 6c  igher states (al
67f0: 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74 20  l states except 
6800: 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61 6e  for.**   OPEN an
6810: 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a 2a  d ERROR). .**.**
6820: 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65 74     dbSize is set
6830: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
6840: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
6850: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
6860: 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72 67  ay be .**   larg
6870: 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a 65  er than the size
6880: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6890: 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72   (the value stor
68a0: 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ed at offset.** 
68b0: 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74 61    28 of the data
68c0: 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20 74  base header by t
68d0: 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74 68  he btree). If th
68e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
68f0: 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61  le.**   is not a
6900: 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70  n integer multip
6910: 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  le of the page-s
6920: 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20 73  ize, the value s
6930: 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64 62  tored in.**   db
6940: 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64 20  Size is rounded 
6950: 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b 42  down (i.e. a 5KB
6960: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6970: 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53 69  ge-size has dbSi
6980: 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78 63  ze==2)..**   Exc
6990: 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74 68  ept, any file th
69a0: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
69b0: 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
69c0: 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
69d0: 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61 74  .**   to have at
69e0: 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e   least one page.
69f0: 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69 6c   (i.e. a 1KB fil
6a00: 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d 73  e with 2K page-s
6a10: 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20 74  ize leads.**   t
6a20: 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a 2a  o dbSize==1)..**
6a30: 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20 77  .**   During a w
6a40: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a50: 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68 20  , if pages with 
6a60: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72 65  page-numbers gre
6a70: 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 64  ater than.**   d
6a80: 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66 69  bSize are modifi
6a90: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
6aa0: 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74   dbSize is updat
6ab0: 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ed accordingly..
6ac0: 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c 20  **   Similarly, 
6ad0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
6ae0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73 69  is truncated usi
6af0: 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74 65  ng PagerTruncate
6b00: 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20 64  Image(), .**   d
6b10: 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65 64  bSize is updated
6b20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  ..**.**   Variab
6b30: 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20 61  les dbOrigSize a
6b40: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61 72  nd dbFileSize ar
6b50: 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74 65  e valid in state
6b60: 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57 52  s .**   PAGER_WR
6b70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64 20  ITER_LOCKED and 
6b80: 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53 69  higher. dbOrigSi
6b90: 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ze is a copy of 
6ba0: 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20 20  the dbSize.**   
6bb0: 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65 20  variable at the 
6bc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
6bd0: 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
6be0: 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c 6c  used during roll
6bf0: 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20 74  back,.**   and t
6c00: 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
6c10: 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65 73  her or not pages
6c20: 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
6c30: 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a 2a  nalled before.**
6c40: 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65     being modifie
6c50: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f 75  d..**.**   Throu
6c60: 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74 72  ghout a write-tr
6c70: 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69 6c  ansaction, dbFil
6c80: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
6c90: 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20 20  he size of.**   
6ca0: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
6cb0: 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69 73   in pages. It is
6cc0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6cd0: 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74 68  f dbSize when th
6ce0: 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61  e.**   write-tra
6cf0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
6d00: 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75 70  t opened, and up
6d10: 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20 63  dated when VFS c
6d20: 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a  alls are made.**
6d30: 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20 74     to write or t
6d40: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
6d50: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
6d60: 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  k. .**.**   The 
6d70: 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65 20  only reason the 
6d80: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
6d90: 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ble is required 
6da0: 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20 0a  is to suppress .
6db0: 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72 79  **   unnecessary
6dc0: 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e 63   calls to xTrunc
6dd0: 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d 6d  ate() after comm
6de0: 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
6df0: 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20 20  tion. If, .**   
6e00: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
6e10: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
6e20: 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20   the dbFileSize 
6e30: 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61 74  variable indicat
6e40: 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74 68  es .**   that th
6e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6e60: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6e70: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
6e80: 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65 29  e (Pager.dbSize)
6e90: 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  , .**   pager_tr
6ea0: 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c 6c  uncate() is call
6eb0: 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74 72  ed. The pager_tr
6ec0: 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
6ed0: 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a 2a  es xFilesize().*
6ee0: 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20 74  *   to measure t
6ef0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6f00: 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74 68   on disk, and th
6f10: 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74 20  en truncates it 
6f20: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  if required..** 
6f30: 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73 20    dbFileSize is 
6f40: 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72 6f  not used when ro
6f50: 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
6f60: 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
6f70: 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67 65  s case.**   page
6f80: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6f90: 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74 69  called unconditi
6fa0: 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d 65  onally (which me
6fb0: 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62 65  ans there may be
6fc0: 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f 20  .**   a call to 
6fd0: 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61 74  xFilesize() that
6fe0: 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c 79   is not strictly
6ff0: 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20 65   required). In e
7000: 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20 20  ither case,.**  
7010: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
7020: 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  ) may cause the 
7030: 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20 73  file to become s
7040: 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65 72  maller or larger
7050: 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53 69  ..**.** dbHintSi
7060: 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 64  ze.**.**   The d
7070: 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61 62  bHintSize variab
7080: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c 69  le is used to li
7090: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
70a0: 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f 0a  f calls made to.
70b0: 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46 69  **   the VFS xFi
70c0: 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f  leControl(FCNTL_
70d0: 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f  SIZE_HINT) metho
70e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48 69  d. .**.**   dbHi
70f0: 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  ntSize is set to
7100: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64   a copy of the d
7110: 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 77  bSize variable w
7120: 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74 65  hen a.**   write
7130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
7140: 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20 73  opened (at the s
7150: 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46 69  ame time as dbFi
7160: 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20 20  leSize and.**   
7170: 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66 20  dbOrigSize). If 
7180: 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
7190: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
71a0: 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  ) method is call
71b0: 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74 53  ed,.**   dbHintS
71c0: 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  ize is increased
71d0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
71e0: 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f 72  f pages that cor
71f0: 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a 2a  respond to the.*
7200: 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70 61  *   size-hint pa
7210: 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74 68  ssed to the meth
7220: 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61 67  od call. See pag
7230: 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
7240: 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65  t() for .**   de
7250: 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72 72  tails..**.** err
7260: 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  Code.**.**   The
7270: 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
7280: 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79 20  ariable is only 
7290: 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41 47  ever used in PAG
72a0: 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
72b0: 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20 74  It.**   is set t
72c0: 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f 74  o zero in all ot
72d0: 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20 50  her states. In P
72e0: 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
72f0: 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  , Pager.errCode 
7300: 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73 20  .**   is always 
7310: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46 55  set to SQLITE_FU
7320: 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
7330: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 53   or one of the S
7340: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
7350: 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73 2e  .**   sub-codes.
7360: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
7370: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
7380: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
7390: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
73a0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
73b0: 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65  /.  u8 exclusive
73c0: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
73d0: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65  /* Boolean. True
73e0: 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   if locking_mode
73f0: 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20  ==EXCLUSIVE */. 
7400: 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b   u8 journalMode;
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7420: 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45 52  One of the PAGER
7430: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76  _JOURNALMODE_* v
7440: 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73  alues */.  u8 us
7450: 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  eJournal;       
7460: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20         /* Use a 
7470: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
7480: 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
7490: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74b0: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
74c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
74d0: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
74e0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
74f0: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
7500: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
7510: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
7520: 73 73 20 2a 2f 0a 20 20 75 38 20 65 78 74 72 61  ss */.  u8 extra
7530: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
7540: 20 20 20 20 2f 2a 20 73 79 6e 63 20 64 69 72 65      /* sync dire
7550: 63 74 6f 72 79 20 61 66 74 65 72 20 6a 6f 75 72  ctory after jour
7560: 6e 61 6c 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20  nal delete */.  
7570: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7590: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
75a0: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
75b0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
75c0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
75d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
75e0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
75f0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
7600: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7610: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7620: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7630: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7640: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7650: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7670: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7680: 70 6f 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61  porary or immuta
7690: 62 6c 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ble file */.  u8
76a0: 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20   noLock;        
76b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76c0: 6e 6f 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74  not lock (except
76d0: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f   in WAL mode) */
76e0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
7710: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
7720: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
7750: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
7760: 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a   */..  /********
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77b0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
77c0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
77d0: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
77e0: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 63 68   members that ch
77f0: 61 6e 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  ange during.  **
7800: 20 72 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69   routine operati
7810: 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65  on.  Class membe
7820: 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62  rs not in this b
7830: 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65 72 20  lock are either 
7840: 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20  fixed.  ** when 
7850: 74 68 65 20 70 61 67 65 72 20 69 73 20 66 69 72  the pager is fir
7860: 73 74 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c  st created or el
7870: 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77  se only change w
7880: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20  hen there is a. 
7890: 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20   ** significant 
78a0: 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73 75 63  mode change (suc
78b0: 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68  h as changing th
78c0: 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63  e page_size, loc
78d0: 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20  king_mode,.  ** 
78e0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d  or the journal_m
78f0: 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74  ode).  From anot
7900: 68 65 72 20 76 69 65 77 2c 20 74 68 65 73 65 20  her view, these 
7910: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
7920: 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20  scribe.  ** the 
7930: 22 73 74 61 74 65 22 20 6f 66 20 74 68 65 20 70  "state" of the p
7940: 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65  ager, while othe
7950: 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  r class members 
7960: 64 65 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a  describe the.  *
7970: 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  * "configuration
7980: 22 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  " of the pager..
7990: 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65    */.  u8 eState
79a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74     /* Pager stat
79c0: 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c  e (OPEN, READER,
79d0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e   WRITER_LOCKED..
79e0: 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b  ) */.  u8 eLock;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f     /* Current lo
7a10: 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62  ck held on datab
7a20: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
7a30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
7a40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
7a50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
7a60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
7a70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
7a80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7aa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
7ab0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
7ac0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
7ad0: 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20  oNotSpill;      
7ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7af0: 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  t spill the cach
7b00: 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  e when non-zero 
7b10: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7b20: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7b30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7b40: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7b50: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62  urnals */.  u8 b
7b60: 55 73 65 46 65 74 63 68 3b 20 20 20 20 20 20 20  UseFetch;       
7b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7b80: 74 6f 20 75 73 65 20 78 46 65 74 63 68 28 29 20  to use xFetch() 
7b90: 2a 2f 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53  */.  u8 hasHeldS
7ba0: 68 61 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20  haredLock;      
7bb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 73 68   /* True if a sh
7bc0: 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76  ared lock has ev
7bd0: 65 72 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a  er been held */.
7be0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7c10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7c20: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7c30: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7c40: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7c50: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7c60: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7c70: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7c90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7ca0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
7cb0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
7cc0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
7cd0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
7ce0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7cf0: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7d00: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d20: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7d30: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7d40: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7d70: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7d80: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
7d90: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
7da0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
7db0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
7dc0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
7dd0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
7de0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7df0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7e10: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7e20: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7e30: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7e40: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7e50: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7e60: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7e70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7e90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
7ea0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7eb0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
7ec0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ed0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
7ee0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7ef0: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7f00: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7f10: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7f20: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7f30: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7f40: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7f50: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7f60: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7f70: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7f80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7f90: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7fa0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7fb0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7fc0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7fd0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7fe0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7ff0: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
8000: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
8010: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
8020: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
8030: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
8040: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
8050: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
8060: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
8070: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
8080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8090: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
80a0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
80b0: 74 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61  t[] */.  u32 iDa
80c0: 74 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20  taVersion;      
80d0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
80e0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
80f0: 65 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65  e content change
8100: 73 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  s */.  char dbFi
8110: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
8120: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
8130: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
8140: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
8150: 0a 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b  .  int nMmapOut;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70  * Number of mmap
8180: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
8190: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a   outstanding */.
81a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
81b0: 73 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  szMmap;       /*
81c0: 20 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d   Desired maximum
81d0: 20 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20   mmap size */.  
81e0: 50 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65  PgHdr *pMmapFree
81f0: 6c 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c  list;       /* L
8200: 69 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70  ist of free mmap
8210: 20 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70   page headers (p
8220: 44 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20  Dirty) */.  /*. 
8230: 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72   ** End of the r
8240: 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e  outinely-changin
8250: 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a  g class members.
8260: 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    **************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
82b0: 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20    u16 nExtra;   
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
82e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
82f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
8300: 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20   i16 nReserve;  
8310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8320: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
8330: 20 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66   bytes at end of
8340: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
8350: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
8360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8370: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
8380: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
8390: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
83a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
83b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
83c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
83d0: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61  back */.  int pa
83e0: 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
83f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8400: 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61  of bytes in a pa
8410: 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  ge */.  Pgno mxP
8420: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
8430: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
8440: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
8450: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
8460: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
8470: 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20  Limit;       /* 
8480: 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70  Size limit for p
8490: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
84a0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61  l files */.  cha
84b0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
84c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
84d0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
84e0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
84f0: 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
8500: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8510: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
8520: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  le */.  int (*xB
8530: 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
8540: 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  *); /* Function 
8550: 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73  to call when bus
8560: 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  y */.  void *pBu
8570: 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20  syHandlerArg;   
8580: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72     /* Context ar
8590: 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79  gument for xBusy
85a0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74  Handler */.  int
85b0: 20 61 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20   aStat[3];      
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
85d0: 6c 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69  l cache hits, mi
85e0: 73 73 65 73 20 61 6e 64 20 77 72 69 74 65 73 20  sses and writes 
85f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8600: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61  _TEST.  int nRea
8610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
8620: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8630: 70 61 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65  pages read */.#e
8640: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
8650: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
8660: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
8670: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
8680: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
8690: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
86a0: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
86b0: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
86c0: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
86d0: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
86e0: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
86f0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
8700: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
8710: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
8720: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
8730: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
8740: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
8750: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
8760: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
8770: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
8780: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
8790: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
87a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
87b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
87c0: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
87d0: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
87e0: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
87f0: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
8800: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
8810: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
8820: 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50   */.  PCache *pP
8830: 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20  Cache;          
8840: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8850: 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63  page cache objec
8860: 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  t */.#ifndef SQL
8870: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57  ITE_OMIT_WAL.  W
8880: 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20  al *pWal;       
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
88a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73  ite-ahead log us
88b0: 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d  ed by "journal_m
88c0: 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68  ode=wal" */.  ch
88d0: 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20  ar *zWal;       
88e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
88f0: 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65  e name for write
8900: 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65  -ahead log */.#e
8910: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49  ndif.};../*.** I
8920: 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77  ndexes for use w
8930: 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b  ith Pager.aStat[
8940: 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74  ]. The Pager.aSt
8950: 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  at[] array conta
8960: 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  ins.** the value
8970: 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61  s accessed by pa
8980: 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53  ssing SQLITE_DBS
8990: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
89a0: 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20   CACHE_MISS .** 
89b0: 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74  or CACHE_WRITE t
89c0: 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61  o sqlite3_db_sta
89d0: 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tus()..*/.#defin
89e0: 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  e PAGER_STAT_HIT
89f0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
8a00: 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a  ER_STAT_MISS  1.
8a10: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a20: 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a  AT_WRITE 2../*.*
8a30: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8a40: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8a50: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8a60: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8a70: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8a80: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8a90: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8aa0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8ab0: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8ac0: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
8ad0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
8ae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
8af0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
8b00: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
8b10: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8b20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8b30: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8b40: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8b50: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8b60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8b70: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8b80: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8b90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8ba0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8bb0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8bc0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
8bd0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
8be0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
8bf0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
8c00: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
8c10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
8c20: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8c30: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8c40: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8c50: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8c60: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8c70: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8c80: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8c90: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8ca0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8cb0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8cc0: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
8cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
8ce0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
8cf0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
8d00: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8d10: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
8d20: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8d40: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8d50: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8d60: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8d70: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8d80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8d90: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8da0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8db0: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8dc0: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
8dd0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
8de0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
8df0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
8e00: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
8e10: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
8e20: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8e30: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8e40: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8e50: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8e60: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8e70: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8e80: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8e90: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8ea0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8eb0: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8ec0: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
8ed0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
8ee0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
8ef0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
8f00: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
8f10: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
8f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8f30: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8f40: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8f50: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8f60: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8f70: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8f80: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8f90: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8fa0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8fb0: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8fc0: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
8fd0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
8fe0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
8ff0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
9000: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
9010: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
9020: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
9030: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
9040: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
9050: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
9060: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
9070: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
9080: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
9090: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
90a0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
90b0: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
90c0: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
90d0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
90e0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
90f0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
9100: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
9110: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
9120: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
9130: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
9140: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
9150: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
9160: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
9170: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
9180: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
9190: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
91a0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
91b0: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
91c0: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
91d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
91e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
91f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
9200: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9210: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
9220: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
9230: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
9240: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
9250: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
9260: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
9270: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
9280: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
9290: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
92a0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
92b0: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
92c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
92d0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
92e0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
92f0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
9300: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
9310: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
9320: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
9330: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9340: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
9350: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
9360: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
9370: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
9380: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
9390: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
93a0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
93b0: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
93c0: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
93d0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
93e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
93f0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
9400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
9410: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
9420: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
9430: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
9440: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
9450: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9460: 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20   macro USEFETCH 
9470: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
9480: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65  e allowed to use
9490: 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20   the xFetch and 
94a0: 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65  xUnfetch.** inte
94b0: 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73  rfaces to access
94c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
94d0: 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65  ing memory-mappe
94e0: 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51  d I/O..*/.#if SQ
94f0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
9500: 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53  ZE>0.# define US
9510: 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e  EFETCH(x) ((x)->
9520: 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65  bUseFetch).#else
9530: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9540: 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a  CH(x) 0.#endif..
9550: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
9560: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
9570: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
9580: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
9590: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
95a0: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
95b0: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
95c0: 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66  his macro is a f
95d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28  ile descriptor (
95e0: 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c  type sqlite3_fil
95f0: 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30  e*)..** Return 0
9600: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70   if it is not op
9610: 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20  en, or non-zero 
9620: 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69  (but not 1) if i
9630: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t is..**.** This
9640: 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72   is so that expr
9650: 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77  essions can be w
9660: 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a  ritten as:.**.**
9670: 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
9680: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e  ager->jfd) ){ ..
9690: 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20  ..**.** instead 
96a0: 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70  of.**.**   if( p
96b0: 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
96c0: 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23  hods ){ ....*/.#
96d0: 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46  define isOpen(pF
96e0: 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68  d) ((pFd)->pMeth
96f0: 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52  ods!=0)../*.** R
9700: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9710: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9720: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9730: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9740: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
9750: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
9760: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
9770: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9780: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
9790: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
97a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
97b0: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
97c0: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
97d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
97e0: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
97f0: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9800: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9810: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9820: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9830: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9840: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
9850: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
9860: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
9870: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
9880: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9890: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
98a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
98b0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
98c0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
98d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
98e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
98f0: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9900: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9910: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9920: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9930: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9940: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
9950: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
9960: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
9970: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
9980: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9990: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
99a0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
99b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
99c0: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
99d0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
99e0: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
99f0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9a00: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9a10: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9a40: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
9a50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a60: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
9a70: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9a80: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9a90: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9aa0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ab0: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9ac0: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9ad0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9ae0: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9af0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9b00: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9b10: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9b20: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9b40: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
9b50: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
9b60: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
9b70: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
9b80: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9b90: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9ba0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9bb0: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9bc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9bd0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9be0: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9bf0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9c00: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9c10: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9c20: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9c30: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9c40: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
9c50: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
9c60: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
9c70: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
9c80: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9c90: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9ca0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9cb0: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9cc0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9cd0: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9ce0: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9d00: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9d10: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9d20: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9d30: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9d40: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
9d50: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
9d60: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
9d70: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
9d80: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9d90: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9da0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9db0: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9dc0: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9dd0: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9de0: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9df0: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9e00: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9e10: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9e30: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9e40: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
9e50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
9e60: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
9e70: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
9e80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9e90: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9ea0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9eb0: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9ec0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9ed0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9ee0: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9ef0: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9f00: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9f10: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9f20: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f40: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9f50: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9f60: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
9f70: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
9f80: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9f90: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9fa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9fb0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9fc0: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9fd0: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9ff0: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
a000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
a010: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
a020: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
a030: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
a040: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
a050: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
a060: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
a070: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
a080: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
a090: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
a0a0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
a0b0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a0c0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
a0d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
a0e0: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
a0f0: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
a100: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
a110: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
a120: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a130: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a140: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a150: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
a160: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
a170: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
a180: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
a190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a1a0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
a1b0: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
a1c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a1d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a1e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1f0: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a200: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a210: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a220: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
a230: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a240: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a250: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
a260: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a270: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a280: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a290: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a2a0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a2b0: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
a2c0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a2d0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a2e0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a2f0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a310: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
a320: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
a330: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
a340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a350: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a360: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a370: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a380: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a390: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a3a0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a3b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3c0: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
a3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a3e0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a3f0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
a400: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a410: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
a420: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a440: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a450: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
a460: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
a470: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
a480: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
a490: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
a4a0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
a4b0: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
a4c0: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
a4d0: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
a4e0: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
a4f0: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
a500: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
a510: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
a520: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
a530: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
a540: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
a550: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
a560: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
a570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
a580: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
a590: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
a5a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a5b0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a5d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a5e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a5f0: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a600: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a610: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a620: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
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 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a670: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a680: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a690: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a6a0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a6b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a6c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a6d0: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a6e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a6f0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a700: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a710: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a720: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a730: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a740: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a750: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a760: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a780: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a790: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a7a0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a7b0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a7c0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a7d0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a7e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a7f0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a800: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a820: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a830: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a840: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a850: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a860: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a870: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a880: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a890: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a8a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a8b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a8c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a8d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a8e0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a8f0: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a900: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a910: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a920: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a930: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a940: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a950: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a960: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a970: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a980: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a990: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a9a0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a9b0: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a9c0: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a9d0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a9e0: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a9f0: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
aa00: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
aa10: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
aa20: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
aa30: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
aa40: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
aa50: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
aa60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
aa70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
aa80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
aa90: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
aaa0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
aab0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
aac0: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
aad0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
aae0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
aaf0: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
ab00: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
ab10: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
ab20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
ab30: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
ab40: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
ab50: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
ab60: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ab70: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
ab80: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
ab90: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
aba0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
abb0: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
abc0: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
abd0: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
abe0: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
abf0: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
ac00: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
ac10: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
ac20: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
ac30: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
ac40: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
ac50: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
ac60: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
ac70: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
ac80: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
ac90: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
aca0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
acb0: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
acc0: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
acd0: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
ace0: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
acf0: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
ad00: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
ad10: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
ad20: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
ad30: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad40: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
ad50: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ad60: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
ad70: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
ad80: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
ad90: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
ada0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
adb0: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
adc0: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
add0: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
ade0: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
adf0: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
ae00: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
ae20: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
ae30: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
ae40: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
ae50: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
ae60: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ae70: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
ae80: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
ae90: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aea0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
aeb0: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
aec0: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
aed0: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
aee0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
aef0: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
af00: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
af10: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
af20: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
af30: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
af40: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
af50: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
af60: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
af70: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
af80: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af90: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
afa0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
afb0: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
afc0: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
afd0: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
afe0: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aff0: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
b000: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
b010: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
b020: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
b030: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
b040: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
b050: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
b060: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
b070: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b080: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
b090: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
b0a0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b0b0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
b0c0: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
b0d0: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b0e0: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
b0f0: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
b100: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
b110: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
b120: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b130: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
b140: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
b150: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b160: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b170: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
b180: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
b190: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1a0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1b0: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
b1c0: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
b1d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b1e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b1f0: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
b200: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
b210: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b220: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b230: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
b240: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
b250: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b260: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b270: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
b280: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
b290: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b2a0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
b2b0: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
b2c0: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
b2d0: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
b2e0: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
b2f0: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
b300: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
b310: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
b320: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
b330: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
b340: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
b350: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b360: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
b370: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
b380: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
b390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
b3a0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
b3b0: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
b3c0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b3d0: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
b3e0: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
b3f0: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
b400: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
b410: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
b420: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
b430: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
b440: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
b450: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
b460: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
b470: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
b480: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
b490: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
b4a0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
b4b0: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
b4d0: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
b4e0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
b4f0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
b500: 67 65 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65  ger;.  PagerSave
b510: 70 6f 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f  point *p;.  Pgno
b520: 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
b530: 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  o;.  int i;.  fo
b540: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d  r(i=0; i<pPager-
b550: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b  >nSavepoint; i++
b560: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67  ){.    p = &pPag
b570: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
b580: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f  ];.    if( p->nO
b590: 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d  rig>=pgno && 0==
b5a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b5b0: 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53  tNotNull(p->pInS
b5c0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
b5d0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b5e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b5f0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64  eturn 0;.}..#ifd
b600: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b620: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b630: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b650: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b660: 49 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  InJournal(Pager 
b670: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
b680: 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  pPg){.  return s
b690: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
b6a0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
b6b0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
b6c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b6d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
b6e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b6f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b700: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b710: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b720: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b730: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b740: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b750: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b760: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b770: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b780: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b790: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b7a0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b7b0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b7c0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b7d0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7e0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7f0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b800: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b810: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b820: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b830: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b840: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b860: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b870: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b880: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b890: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b8a0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b8b0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b8c0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b8d0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b8e0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b8f0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b900: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b910: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b920: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b930: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b940: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b950: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b960: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b970: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b980: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b990: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b9a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b9b0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b9c0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b9d0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b9e0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b9f0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
ba00: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
ba10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ba20: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
ba30: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
ba40: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ba50: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
ba60: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
ba70: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
ba80: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
ba90: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
baa0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
bab0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
bac0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
bad0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
bae0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
baf0: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
bb00: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
bb10: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
bb20: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
bb30: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
bb40: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
bb50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
bb60: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bb70: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
bb80: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
bb90: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
bba0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
bbb0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
bbc0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
bbd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
bbe0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
bbf0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
bc00: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
bc10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
bc20: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
bc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
bc40: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
bc50: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
bc60: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
bc70: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
bc80: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
bc90: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
bca0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
bcb0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
bcc0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
bcd0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
bce0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
bcf0: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
bd00: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
bd10: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
bd20: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
bd30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
bd40: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
bd50: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
bd60: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
bd70: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
bd80: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
bd90: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
bda0: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
bdb0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
bdc0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
bdd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bde0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
bdf0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
be00: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
be10: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
be20: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
be30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
be40: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
be50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
be60: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
be70: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
be80: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
be90: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
bea0: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
beb0: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
bec0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
bed0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
bee0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
bef0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
bf00: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
bf10: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
bf20: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
bf30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
bf40: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
bf50: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
bf60: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
bf70: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
bf80: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
bf90: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
bfa0: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
bfb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bfc0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
bfd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
bfe0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
bff0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
c000: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
c010: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
c020: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
c030: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
c040: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
c050: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
c060: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c070: 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f   rc = pPager->no
c080: 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Lock ? SQLITE_OK
c090: 20 3a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   : sqlite3OsLock
c0a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f  (pPager->fd, eLo
c0b0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ck);.    if( rc=
c0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70  =SQLITE_OK && (p
c0d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  Pager->eLock!=UN
c0e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63  KNOWN_LOCK||eLoc
c0f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c100: 4b 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  K) ){.      pPag
c110: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c120: 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  eLock;.      IOT
c130: 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
c140: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
c150: 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ock)).    }.  }.
c160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c170: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
c180: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
c190: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c1a0: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
c1b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
c1c0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
c1d0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
c1e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c1f0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
c200: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
c210: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c220: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
c230: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
c240: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
c250: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
c260: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
c270: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
c280: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
c290: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
c2a0: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
c2b0: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
c2c0: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
c2d0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
c2e0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
c2f0: 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73  n is also always
c300: 20 65 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d   enabled for tem
c310: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74  porary files. It
c320: 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   is.** an error 
c330: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
c340: 63 74 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20  ction if pPager 
c350: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20  is opened on an 
c360: 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74  in-memory.** dat
c370: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
c380: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
c390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
c3a0: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
c3b0: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
c3c0: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
c3d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c3e0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c400: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
c410: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
c420: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
c430: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
c440: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
c450: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
c460: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
c470: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
c480: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21  er){.  assert( !
c490: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
c4a0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c4b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20   ){.    int dc; 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c4e0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c4f0: 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ics */.    int n
c500: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20  Sector;         
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c520: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
c530: 20 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20     int szPage;  
c540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c550: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
c560: 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  e */..    assert
c570: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c580: 3e 66 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d  >fd) );.    dc =
c590: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
c5a0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
c5b0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
c5c0: 20 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65   nSector = pPage
c5d0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
c5e0: 20 20 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67     szPage = pPag
c5f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
c600: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
c610: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
c620: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
c630: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c640: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
c650: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
c660: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
c670: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c680: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
c690: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
c6c0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
c6d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
c6e0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c6f0: 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  Pager);.}.#endif
c700: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
c710: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
c720: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
c730: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
c740: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
c750: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
c760: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
c770: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
c780: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
c790: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
c7a0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
c7b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
c7c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
c7d0: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
c7e0: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
c7f0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
c800: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
c810: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
c820: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
c830: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
c840: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
c850: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
c860: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
c870: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
c880: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
c890: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
c8a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c8b0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
c8c0: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
c8d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8e0: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
c8f0: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
c900: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
c910: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
c920: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
c930: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
c940: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
c950: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
c960: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
c970: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
c980: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
c990: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
c9a0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
c9b0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c9c0: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
c9d0: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
c9e0: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
c9f0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
ca00: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
ca10: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
ca20: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
ca30: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
ca40: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
ca50: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
ca60: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
ca70: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
ca80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
ca90: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
caa0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cab0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
cac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
cad0: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
cae0: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
caf0: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
cb00: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
cb10: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
cb20: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
cb30: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
cb40: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
cb50: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cb60: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
cb70: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cb80: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
cb90: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cba0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cbb0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cbc0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cbe0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cbf0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cc00: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cc10: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cc20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cc30: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cc40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cc50: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cc60: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cc70: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cc80: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cc90: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cca0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
ccb0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
ccc0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
ccd0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
cce0: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
ccf0: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
cd00: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
cd10: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
cd20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
cd30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
cd40: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
cd50: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
cd60: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
cd70: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
cd80: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
cd90: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
cda0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
cdb0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
cdc0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
cdd0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
cde0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
cdf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce00: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
ce10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ce20: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
ce30: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
ce40: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
ce50: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
ce60: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
ce70: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
ce80: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
ce90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
cea0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
ceb0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
cec0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
ced0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cee0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cef0: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
cf00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
cf10: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
cf20: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
cf30: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
cf40: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
cf50: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
cf60: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
cf70: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
cf80: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
cf90: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
cfa0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
cfb0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
cfc0: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
cfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
cfe0: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
cff0: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d000: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d010: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d020: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d030: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d040: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d050: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d060: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d070: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d080: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d090: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d0a0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d0b0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d0c0: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d0d0: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d0e0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d0f0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d100: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d110: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d120: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d130: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d150: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d180: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d190: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d1a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d1d0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d1e0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d210: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d220: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d230: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d240: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d250: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d260: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d270: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d280: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d290: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d2a0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d2b0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d2c0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d2d0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d2e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d2f0: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d300: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d310: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d320: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d330: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d340: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d350: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d360: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d370: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d380: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d390: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d3a0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d3b0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d3c0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d3d0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d3e0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d3f0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d400: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d410: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d420: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d430: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d450: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d460: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d470: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d480: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d490: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d4a0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d4b0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d4c0: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d4d0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d4e0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d4f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d500: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d510: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d520: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d530: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d540: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d550: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d560: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d570: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d580: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d590: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d5a0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d5b0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d5c0: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d5d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d5e0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d5f0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d600: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d610: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d620: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d630: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d640: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d650: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d660: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d670: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d680: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d690: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d6a0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d6b0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d6c0: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d6d0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d700: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d730: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d740: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d750: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d760: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d770: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d790: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d7a0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d7b0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d7c0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d7d0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d7e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d7f0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d800: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d810: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d820: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d830: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d860: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d870: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d880: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d890: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d8a0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d8b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d8c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d8d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d8e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d8f0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d900: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d910: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d920: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d930: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d950: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d960: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d970: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d980: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d990: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d9a0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d9b0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d9c0: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d9d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d9e0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d9f0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
da00: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
da10: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
da20: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
da30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
da40: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
da50: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
da60: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
da70: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
da80: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
da90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
daa0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
dab0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
dac0: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
dad0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
dae0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
daf0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
db00: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
db10: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
db20: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
db30: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
db40: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
db50: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
db60: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
db70: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
db80: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
db90: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dba0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
dbb0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
dbc0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
dbd0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
dbe0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
dbf0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
dc00: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
dc10: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
dc20: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
dc30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dc40: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
dc50: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dc60: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dc70: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dc80: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dc90: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dca0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dcb0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
dcc0: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
dcd0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
dce0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
dcf0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
dd00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd30: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
dd40: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
dd50: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
dd60: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a  ssert( !sqlite3J
dd70: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
dd80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
dda0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
ddb0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
ddc0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
ddd0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
dde0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
ddf0: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
de00: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
de10: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
de20: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
de30: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
de40: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
de50: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
de60: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
de70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
de80: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
de90: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
dea0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
deb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
dec0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ded0: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
dee0: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
def0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
df00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
df10: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
df20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df30: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
df40: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
df50: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
df60: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
df70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
df80: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
dfa0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
dfb0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
dfc0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
dfd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
dfe0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
dff0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
e000: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
e010: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
e020: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
e030: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
e040: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
e050: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
e060: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
e070: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
e080: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
e090: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
e0a0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
e0b0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
e0c0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
e0d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e0e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e0f0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
e100: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
e110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e120: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e130: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
e140: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e150: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
e160: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e170: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e180: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
e190: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
e1a0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e1b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e1c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e1d0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e1e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e1f0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
e200: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
e210: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
e220: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e230: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e240: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e250: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e260: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e270: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e280: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e290: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e2a0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e2b0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e2c0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e2d0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e2e0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e2f0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e300: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e310: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e320: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e330: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e340: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e350: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e360: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e370: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e380: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e390: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e3a0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e3b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e3c0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e3d0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e3e0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e3f0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e400: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e420: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e440: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e450: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e460: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e470: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e480: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e490: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e4a0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e4b0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e4c0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e4d0: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e4e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e4f0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e500: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e510: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e520: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e550: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e560: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e590: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e5a0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e5b0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e5c0: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e5d0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e5e0: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e5f0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e600: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e610: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e630: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e640: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e650: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e660: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e670: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e680: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e690: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e6a0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e6b0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
e6c0: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
e6d0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
e6e0: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
e6f0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
e700: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
e710: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
e720: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
e730: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
e740: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
e750: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
e760: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
e770: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e780: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
e790: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
e7a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
e7b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
e7c0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
e7d0: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
e7e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
e7f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
e800: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
e810: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
e820: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
e830: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
e840: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
e850: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
e860: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
e870: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
e880: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
e890: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e8a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
e8b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
e8c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
e8d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
e8e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
e8f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
e900: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
e910: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
e920: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
e930: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
e940: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
e950: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
e960: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
e970: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
e980: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
e990: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
e9a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
e9b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
e9c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
e9d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
e9e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
e9f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
ea00: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
ea10: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
ea20: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
ea30: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
ea40: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
ea50: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
ea60: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
ea70: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
ea80: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
ea90: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
eaa0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
eab0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
eac0: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ead0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
eae0: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
eaf0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
eb00: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
eb10: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
eb20: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
eb30: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
eb40: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
eb50: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
eb60: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
eb70: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
eb80: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
eb90: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
eba0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
ebb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
ebc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
ebd0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
ebe0: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
ebf0: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
ec00: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
ec10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ec20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ec30: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ec40: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ec50: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
ec60: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
ec70: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
ec80: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
ec90: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
eca0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
ecb0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ecc0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
ecd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
ece0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ecf0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
ed00: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
ed10: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
ed20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
ed30: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
ed40: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
ed50: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
ed60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
ed70: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
ed80: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
ed90: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
eda0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
edb0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
edc0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
edd0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ede0: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
edf0: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
ee00: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
ee10: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
ee20: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
ee30: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
ee40: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
ee50: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
ee60: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
ee70: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
ee80: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
ee90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eea0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eeb0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
eec0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
eed0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
eee0: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
eef0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ef00: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ef10: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
ef20: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
ef30: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
ef40: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
ef50: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
ef60: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
ef70: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
ef80: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
ef90: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
efa0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
efb0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
efc0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
efd0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
efe0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
eff0: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
f000: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
f010: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
f020: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
f030: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
f040: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f050: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
f060: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
f070: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f080: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
f090: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
f0a0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
f0b0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
f0c0: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
f0d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
f0e0: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
f0f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f100: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
f110: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
f120: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f130: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
f140: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
f150: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
f160: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
f170: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
f180: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
f190: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
f1a0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
f1b0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
f1c0: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
f1d0: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
f1e0: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
f1f0: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
f200: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
f210: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
f220: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f230: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f240: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f250: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f260: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f270: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f280: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f290: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f2a0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f2b0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f2c0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f2d0: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f2e0: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f2f0: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f300: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f310: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f320: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f330: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f340: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f350: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f360: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f370: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f380: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f390: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f3a0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f3b0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f3c0: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f3d0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f3e0: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f3f0: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f400: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f410: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f420: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f430: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f440: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f450: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f460: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f470: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f480: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f490: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f4a0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f4b0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f4e0: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f4f0: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f500: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f510: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f520: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f530: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f550: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f560: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f580: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f590: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f5a0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f5b0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f5c0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f5f0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f600: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f610: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f620: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f630: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f640: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f650: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f660: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f670: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f680: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f690: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f6a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f6b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
f6c0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
f6d0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
f6e0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
f6f0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
f700: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
f710: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
f720: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
f730: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
f740: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
f750: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
f760: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
f770: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
f780: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
f790: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
f7a0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
f7b0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
f7c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
f7d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f7e0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
f7f0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
f800: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
f810: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
f820: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
f830: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
f840: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
f850: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
f860: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
f870: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
f880: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
f890: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
f8a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
f8b0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f8c0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
f8d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
f8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f8f0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
f900: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f920: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
f930: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
f940: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
f950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f960: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
f970: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
f980: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
f990: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
f9a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f9b0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
f9c0: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
f9d0: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
f9e0: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
f9f0: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fa00: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
fa10: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
fa20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fa50: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
fa60: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
fa70: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
fa80: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
fa90: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
faa0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fac0: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
fad0: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
fae0: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
faf0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
fb00: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
fb10: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
fb20: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
fb30: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
fb40: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
fb50: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fb60: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
fb70: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
fb80: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
fb90: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
fba0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
fbb0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
fbc0: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
fbd0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
fbe0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
fbf0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
fc00: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
fc10: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
fc20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
fc30: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
fc40: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
fc50: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
fc60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
fc70: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
fc80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
fc90: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
fca0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fcb0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcc0: 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
fcd0: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
fce0: 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
fcf0: 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
fd00: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
fd10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
fd20: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
fd30: 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
fd40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
fd50: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
fd60: 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
fd70: 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
fd80: 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
fd90: 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
fda0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
fdb0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fdc0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
fdd0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
fde0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
fdf0: 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
fe00: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
fe10: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
fe20: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
fe30: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
fe40: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fe50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
fe60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fe70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
fe80: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
fe90: 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
fea0: 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
feb0: 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
fec0: 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
fed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
fee0: 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
fef0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
ff00: 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
ff10: 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
ff20: 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
ff30: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
ff40: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
ff50: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
ff60: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
ff70: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff80: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
ff90: 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
ffa0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffb0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffc0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffd0: 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
ffe0: 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
fff0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10000 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10010 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10020 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
10030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10040 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
10050 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10060 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
10070 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
10080 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
10090 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
100a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
100b0 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
100c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
100d0 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
100e0 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
100f0 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
10100 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
10110 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10120 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
10130 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
10140 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
10150 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10160 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10170 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
10180 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
10190 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
101a0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
101b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
101c0 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
101d0 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
101e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
101f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
10200 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
10210 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
10220 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10230 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10240 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10250 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
10260 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
10270 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
10280 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
10290 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
102a0 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
102b0 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
102c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
102d0 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
102e0 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
102f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
10300 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
10310 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
10320 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10330 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10340 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10350 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
10360 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
10370 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
10380 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
10390 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
103a0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
103b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
103c0 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
103d0 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
103e0 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
103f0 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
10400 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
10410 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
10420 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10430 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10440 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10450 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
10460 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
10470 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
10480 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
10490 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
104a0 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
104b0 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
104c0 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
104d0 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
104e0 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
104f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10500 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
10510 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
10520 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10530 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10540 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10550 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
10560 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
10570 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
10580 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
10590 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
105a0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
105b0 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
105c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
105d0 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
105e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
105f0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10600 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10610 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10630 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10640 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10650 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
10660 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
10670 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
10680 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
10690 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
106a0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
106b0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
106c0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
106d0 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
106e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
106f0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10700 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10710 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10720 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10730 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10740 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10750 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10760 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10770 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10780 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10790 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
107a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
107b0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
107c0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
107d0 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
107e0 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
107f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10800 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10810 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10820 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10830 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10840 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10850 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10860 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10870 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10880 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10890 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
108a0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
108b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
108c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
108d0 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
108e0 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
108f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10900 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10910 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10920 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10940 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10950 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10960 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10970 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10980 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10990 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
109a0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
109b0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
109c0 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
109d0 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
109e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
109f0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10a00 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10a10 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10a20 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10a30 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10a40 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10a50 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10a60 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10a70 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10a80 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10a90 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10aa0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10ab0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10ac0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10ad0 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10ae0 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10af0 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10b00 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10b10 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10b20 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10b30 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10b40 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10b50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10b60 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10b70 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10b80 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10ba0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10bb0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10bc0 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10bd0 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10be0 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10bf0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10c00 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10c10 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10c20 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10c30 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10c40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10c50 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10c60 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10c70 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10c80 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10c90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10cb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10cc0 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
10cf0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10d00 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10d30 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
10d40 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10d50 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
10d80 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
10d90 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10db0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
10dc0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10dd0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
10de0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10df0 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
10e00 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
10e10 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
10e20 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
10e30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
10e50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
10e60 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
10e70 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
10e80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e90 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
10ea0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
10eb0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
10ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
10ed0 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
10ee0 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
10ef0 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
10f00 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
10f10 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
10f20 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
10f30 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
10f40 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
10f50 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
10f60 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
10f70 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
10f80 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
10f90 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
10fa0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
10fb0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
10fc0 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
10fd0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fe0 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
10ff0 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
11000 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
11010 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
11020 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
11030 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
11040 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11050 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11060 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11070 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
11080 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
11090 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
110a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110b0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
110c0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
110d0 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
110e0 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
110f0 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
11100 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11110 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11120 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
11130 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
11140 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11150 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11160 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
11170 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
11180 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
11190 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
111a0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
111b0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
111c0 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
111d0 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
111e0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
111f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11200 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11210 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
11220 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11230 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11240 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11250 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
11260 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
11270 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
11280 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11290 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
112a0 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
112d0 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
112e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
112f0 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
11300 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
11310 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
11320 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11330 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11340 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11350 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
11360 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
11370 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
11380 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
11390 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
113a0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
113b0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
113c0 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
113d0 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
113e0 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
113f0 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
11400 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
11410 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11420 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11430 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11440 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11450 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
11460 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
11470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
11480 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
11490 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
114a0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
114b0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
114c0 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
114d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
114e0 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
114f0 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
11500 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
11510 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11520 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11530 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11540 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11550 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
11560 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
11570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11580 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11590 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
115a0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
115b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
115c0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
115d0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
115e0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
115f0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11600 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11610 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11620 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11630 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11640 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11650 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
11660 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
11670 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
11680 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11690 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
116a0 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
116b0 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
116c0 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
116d0 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
116e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
116f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11700 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
11710 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
11720 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11730 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11740 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11750 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11760 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11770 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11780 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11790 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
117a0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
117b0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
117c0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
117d0 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
117e0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
117f0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11800 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11810 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11820 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11830 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11850 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11860 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11870 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11880 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11890 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
118a0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
118b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118c0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
118d0 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
118e0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
118f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11900 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
11910 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
11920 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
11930 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11940 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11950 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11960 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11970 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11980 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11990 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
119a0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
119b0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
119c0 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
119d0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
119e0 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
119f0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11a00 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11a10 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11a20 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11a30 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11a40 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11a50 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11a60 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11a70 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11a80 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11a90 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11aa0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11ab0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11ac0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ae0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11af0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11b00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11b10 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11b20 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11b30 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11b40 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11b50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11b60 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11b70 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11b80 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11b90 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11ba0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11bb0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11bc0 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11bd0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11be0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11c10 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11c20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11c30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c50 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11c60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11c70 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11c80 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11c90 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11ca0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11cb0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11cc0 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11cd0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11ce0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11cf0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11d00 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11d10 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11d20 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11d30 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11d40 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11d50 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11d60 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11d70 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11d80 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11d90 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11da0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11db0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11dc0 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11dd0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11de0 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11df0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11e00 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11e10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11e20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11e30 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11e40 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11e50 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11e60 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11e70 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11e90 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11ea0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11eb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11ec0 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11ed0 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11ee0 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11ef0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11f00 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11f10 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11f20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11f30 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11f40 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11f50 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11f60 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11f70 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11f80 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11f90 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11fa0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11fb0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11fd0 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ff0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12000 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
12010 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
12020 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
12030 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
12040 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
12050 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
12060 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
12070 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
12080 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
12090 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
120a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
120b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
120c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
120d0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
120e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
120f0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12100 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12110 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12120 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12150 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
12160 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
12170 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
12180 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
12190 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
121a0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
121b0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
121c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
121d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
121e0 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
121f0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12200 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12210 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12220 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12230 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12240 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12250 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
12260 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
12270 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
12280 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
12290 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
122a0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
122b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
122c0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
122d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
122e0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
122f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12310 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12320 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12330 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12340 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12360 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12370 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
12380 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12390 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
123a0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
123b0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
123c0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
123d0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
123e0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
123f0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12400 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12410 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12420 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12440 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12450 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12460 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12480 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12490 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
124a0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
124b0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
124c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
124d0 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
124e0 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
124f0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12500 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12510 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12520 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12530 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12540 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12550 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12560 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12570 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12580 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12590 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
125a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
125b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
125c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
125d0 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
125e0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
125f0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12600 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12610 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12620 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12630 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12640 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12650 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12660 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12670 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12680 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12690 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
126a0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
126b0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
126c0 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
126d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
126e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
126f0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12700 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12710 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12720 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12730 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12740 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12750 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12760 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12770 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12780 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12790 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
127a0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
127b0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
127c0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
127d0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
127e0 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
127f0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12800 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12810 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12820 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12830 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12840 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12850 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12860 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12870 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12880 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12890 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
128a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
128b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
128c0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
128d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
128e0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
128f0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12900 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12920 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12930 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12940 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12950 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12960 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12970 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12990 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
129a0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
129b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
129c0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
129d0 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
129e0 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
129f0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12a00 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12a10 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12a20 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12a30 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12a40 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12a50 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12a60 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12a70 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12a80 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12a90 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12aa0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12ab0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12ac0 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12ad0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12ae0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12af0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12b10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12b20 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12b30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12b40 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12b50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12b60 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12b70 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12b80 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12b90 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12ba0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12bb0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12bc0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12bd0 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12be0 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12bf0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12c00 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12c10 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12c20 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12c30 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12c40 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12c50 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12c60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12c70 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12c80 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12c90 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12ca0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12cb0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12cc0 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12cd0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12ce0 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12d00 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12d10 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12d20 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12d30 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12d40 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12d50 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12d60 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12d70 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12d90 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12da0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12dc0 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12dd0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12de0 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12df0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12e00 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12e10 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12e20 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e40 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12e50 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12e60 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12e70 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12e80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12e90 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12ea0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12eb0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12ec0 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12ed0 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12ee0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12ef0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12f10 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12f20 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12f30 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12f40 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12f50 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12f60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12f70 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12f80 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12f90 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12fa0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12fb0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12fc0 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12fd0 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12fe0 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ff0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
13000 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
13010 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
13020 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
13030 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
13040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
13050 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
13060 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
13070 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
13080 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
13090 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
130a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
130b0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
130c0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
130d0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
130e0 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
130f0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
13100 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
13110 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
13120 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
13130 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
13140 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
13150 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
13160 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
13170 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
13180 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
13190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
131a0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
131b0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
131c0 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
131d0 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
131e0 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
131f0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
13200 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
13210 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
13220 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
13230 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
13240 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
13250 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
13260 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
13270 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
13280 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
13290 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
132a0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
132b0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
132c0 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
132d0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132e0 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
132f0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13300 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13310 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13320 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13330 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13340 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13350 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13360 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
13370 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
13380 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
13390 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
133a0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
133b0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
133c0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
133d0 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
133e0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
133f0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13400 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13410 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13420 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13430 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13440 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13450 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13460 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13470 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13480 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13490 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
134a0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
134b0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
134c0 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
134d0 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
134e0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
134f0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13500 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13510 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13520 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13530 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13540 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13550 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13560 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13570 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13580 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13590 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
135a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
135b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
135c0 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
135d0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
135e0 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
135f0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13600 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13610 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13620 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13630 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13640 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13650 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13660 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13670 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13680 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13690 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
136a0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
136b0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
136c0 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
136d0 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
136e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
136f0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13700 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13710 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13720 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13730 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13740 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13750 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13760 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13770 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13780 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13790 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
137a0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
137b0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
137c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
137d0 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
137e0 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
137f0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13800 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13810 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13820 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13830 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13840 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13850 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13860 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13870 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13880 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13890 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
138a0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
138b0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
138c0 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
138d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
138e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
138f0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13910 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13920 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13930 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13940 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13950 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13970 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13980 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13990 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
139a0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
139b0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
139c0 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
139d0 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
139e0 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
139f0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13a00 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13a10 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13a20 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13a30 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13a40 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13a50 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13a60 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13a70 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13a80 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13a90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13aa0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13ab0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13ac0 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13ad0 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13ae0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13af0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13b00 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13b10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13b20 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13b30 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13b40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13b50 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13b60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13b70 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13b80 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13b90 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13ba0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13bb0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13bc0 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13bd0 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13be0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13bf0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13c00 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13c10 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13c20 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13c30 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13c40 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13c50 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13c60 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13c70 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13c80 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13c90 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13cb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13cc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13ce0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13cf0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13d00 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13d10 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13d20 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13d30 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13d50 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13d60 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13d70 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13d80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13d90 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13da0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13db0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13dc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13de0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13df0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13e00 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13e10 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13e20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72   if( sqlite3Jour
13e30 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50  nalIsInMemory(pP
13e40 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13e50 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
13e60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13e70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13e80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20  LMODE_MEMORY ); 
13e90 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
13ea0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
13eb0 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  jfd);.    }else 
13ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
13ed0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13ee0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
13ef0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ATE ){.      if(
13f00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f10 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
13f20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13f30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13f40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13f50 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
13f60 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13f70 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13f80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
13f90 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
13fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
13fb0 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66  e sure the new f
13fc0 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74  ile size is writ
13fd0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f  ten into the ino
13fe0 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  de right away.. 
13ff0 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65           ** Othe
14000 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  rwise the journa
14010 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63  l might resurrec
14020 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  t following a po
14030 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20  wer loss and.   
14040 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20         ** cause 
14050 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63  the last transac
14060 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63  tion to roll bac
14070 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20  k.  See.        
14080 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67    ** https://bug
14090 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72  zilla.mozilla.or
140a0 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  g/show_bug.cgi?i
140b0 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20  d=1072773.      
140c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
140d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
140e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
140f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
14100 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  gs);.        }. 
14110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
14120 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14130 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
14140 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14150 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14160 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
14170 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  T.      || (pPag
14180 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
14190 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
141a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
141b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29  JOURNALMODE_WAL)
141c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
141d0 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
141e0 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
141f0 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ter);.      pPag
14200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14220 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14230 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14240 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14250 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14260 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14280 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14290 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
142a0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
142b0 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
142c0 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
142d0 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
142e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
142f0 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14300 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14310 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14320 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14330 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14340 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14350 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14360 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14370 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14380 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14390 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
143a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
143b0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
143c0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
143d0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
143e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
143f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14400 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14410 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
14420 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14440 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14450 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
14460 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14470 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14480 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
14490 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
144a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
144b0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
144c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
144d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65  urnal, pPager->e
144e0 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20  xtraSync);.     
144f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
14500 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
14510 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
14520 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
14530 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
14540 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
14550 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
14560 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
14570 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
14580 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
14590 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
145a0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
145b0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
145c0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
145d0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
145e0 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
145f0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
14600 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
14610 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  l(p);.    }.  }.
14620 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
14630 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
14640 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
14650 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  l);.  pPager->pI
14660 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
14670 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14680 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
14690 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
146a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
146b0 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
146c0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
146d0 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
146e0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ize);..  if( pag
146f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14700 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
14710 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
14720 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
14730 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
14740 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
14750 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
14760 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
14770 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
14780 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
14790 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
147a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
147b0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
147c0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
147d0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
147e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
147f0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
14800 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
14810 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
14820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14830 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
14840 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
14850 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
14860 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
14870 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
14880 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
14890 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
148a0 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
148b0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
148c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
148d0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
148e0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
148f0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
14900 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
14910 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
14920 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
14930 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
14940 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
14950 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
14960 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
14970 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
14980 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
14990 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
149a0 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
149b0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
149c0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
149d0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
149e0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
149f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
14a00 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
14a10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
14a20 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
14a30 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
14a40 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14a50 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
14a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
14a70 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65 6e  Commit && isOpen
14a80 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
14a90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14aa0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
14ab0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
14ac0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
14ad0 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
14ae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14af0 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
14b00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
14b10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14b20 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
14b30 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
14b40 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
14b50 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
14b60 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
14b70 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
14b80 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
14b90 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
14ba0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
14bb0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14bc0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
14bd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
14be0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
14bf0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
14c00 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
14c10 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
14c20 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
14c30 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
14c40 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
14c50 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14c60 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
14c70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
14c80 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
14c90 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
14ca0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
14cb0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
14cc0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
14cd0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
14ce0 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
14cf0 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
14d00 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
14d10 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
14d20 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
14d30 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
14d40 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
14d50 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
14d60 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
14d70 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
14d80 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
14d90 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
14da0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
14db0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
14dc0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
14dd0 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
14de0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
14df0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
14e00 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
14e10 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
14e20 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
14e30 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
14e40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14e50 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
14e60 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14e70 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
14e80 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
14e90 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
14ea0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
14eb0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
14ec0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
14ed0 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
14ee0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
14ef0 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
14f00 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
14f10 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
14f20 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14f30 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
14f40 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
14f50 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
14f60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
14f70 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
14f80 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
14f90 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
14fa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
14fb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
14fc0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
14fd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14fe0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
14ff0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15000 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15010 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15020 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15030 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15040 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15050 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15060 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15070 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15080 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15090 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
150a0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
150b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
150c0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
150d0 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
150e0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
150f0 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15100 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15110 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15130 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15140 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15150 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15160 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15170 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15180 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15190 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
151a0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
151b0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
151c0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
151d0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
151e0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
151f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15200 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15210 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15220 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15230 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15240 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15250 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15260 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15270 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15280 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15290 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
152a0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
152b0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
152c0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
152d0 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
152e0 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
152f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15300 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15310 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15320 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15330 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15340 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15350 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15360 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15370 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15380 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15390 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
153a0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
153b0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
153c0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
153d0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
153e0 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
153f0 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
15400 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
15410 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
15420 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
15430 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
15440 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
15450 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
15460 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
15470 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
15480 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
15490 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
154a0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
154b0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
154c0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
154d0 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
154e0 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
154f0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
15500 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
15510 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
15520 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
15530 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15540 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
15550 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
15560 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
15570 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
15580 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15590 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
155a0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
155b0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
155c0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
155d0 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
155e0 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
155f0 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
15600 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
15610 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
15620 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
15630 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
15640 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
15650 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
15660 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
15670 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
15680 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
15690 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
156a0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
156b0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
156c0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
156d0 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
156e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
156f0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
15700 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
15710 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
15720 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
15730 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
15740 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
15750 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
15760 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15770 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
15780 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
15790 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
157a0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
157b0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
157c0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
157d0 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
157e0 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
157f0 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
15800 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
15810 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
15820 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
15830 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
15840 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
15850 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
15860 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
15870 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
15880 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
15890 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
158a0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
158b0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
158c0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
158d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
158e0 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
158f0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
15900 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
15910 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
15920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15930 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
15940 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
15950 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15960 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
15970 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
15980 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
15990 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
159a0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
159b0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
159c0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
159d0 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
159e0 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
159f0 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
15a00 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
15a20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
15a30 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
15a40 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
15a50 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
15a60 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
15a70 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
15a80 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
15a90 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
15aa0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15ab0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
15ac0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
15ad0 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
15ae0 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
15af0 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
15b00 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
15b10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
15b20 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
15b30 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
15b40 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
15b50 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
15b60 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
15b70 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
15b80 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
15b90 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
15ba0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15bb0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
15bc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
15bd0 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
15be0 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
15bf0 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
15c00 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
15c10 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
15c20 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
15c30 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
15c40 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
15c50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
15c60 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
15c70 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15c80 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15c90 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15ca0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
15cb0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
15cc0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
15cd0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
15ce0 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
15cf0 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
15d00 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15d10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
15d20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
15d30 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15d40 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
15d50 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
15d60 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
15d70 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
15d80 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
15d90 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
15da0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
15db0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
15dc0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
15dd0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
15de0 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
15df0 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
15e00 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
15e10 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
15e20 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
15e30 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
15e40 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
15e50 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
15e60 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
15e70 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
15e80 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
15e90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
15ea0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
15eb0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
15ec0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
15ed0 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
15ee0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
15ef0 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
15f00 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
15f10 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
15f20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15f30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
15f40 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
15f50 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
15f60 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
15f70 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
15f80 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
15f90 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
15fa0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
15fb0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
15fc0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
15fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
15fe0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
15ff0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16000 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16010 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16020 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16030 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16040 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16050 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16060 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16070 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16080 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16090 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
160a0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
160b0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
160c0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
160d0 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
160e0 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
160f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16100 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16110 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16120 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16130 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16150 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16160 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16170 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16180 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
161b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
161c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
161f0 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16200 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16210 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16230 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16240 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16260 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16270 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16280 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16290 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
162a0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
162b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
162c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
162d0 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
162e0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
162f0 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16300 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16310 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16320 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  is synced */..  
16330 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a  assert( (isMainJ
16340 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  rnl&~1)==0 );   
16350 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c     /* isMainJrnl
16360 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
16370 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70  assert( (isSavep
16380 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nt&~1)==0 );    
16390 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20     /* isSavepnt 
163a0 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
163b0 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e  ssert( isMainJrn
163c0 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20  l || pDone );   
163d0 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79    /* pDone alway
163e0 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f  s used on sub-jo
163f0 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65  urnals */.  asse
16400 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c  rt( isSavepnt ||
16410 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f   pDone==0 );   /
16420 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73  * pDone never us
16430 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f  ed on non-savepo
16440 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20  int */..  aData 
16450 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
16460 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
16470 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
16480 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
16490 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
164a0 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
164b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61   */.  assert( pa
164c0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
164d0 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e  )==0 || (!isMain
164e0 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e  Jrnl && isSavepn
164f0 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68  t) );..  /* Eith
16500 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20  er the state is 
16510 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47  greater than PAG
16520 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
16530 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f  OD (a transactio
16540 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70  n .  ** or savep
16550 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f  oint rollback do
16560 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73  ne at the reques
16570 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29  t of the caller)
16580 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a   or this is.  **
16590 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
165a0 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69  ollback. If it i
165b0 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
165c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61  rollback, the pa
165d0 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73  ger.  ** is in s
165e0 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f  tate OPEN and ho
165f0 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45  lds an EXCLUSIVE
16600 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e   lock. Hot-journ
16610 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  al rollback.  **
16620 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d   only reads from
16630 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16640 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a  l, not the sub-j
16650 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
16660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16670 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16680 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
16690 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
166a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
166b0 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  EN && pPager->eL
166c0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
166d0 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65  OCK).  );.  asse
166e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
166f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
16700 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d  _CACHEMOD || isM
16710 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a  ainJrnl );..  /*
16720 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e   Read the page n
16730 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64  umber and page d
16740 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ata from the jou
16750 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
16760 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52  nal.  ** file. R
16770 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
16780 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
16790 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  r if an IO error
167a0 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20   occurs..  */.  
167b0 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c  jfd = isMainJrnl
167c0 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
167d0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20   pPager->sjfd;. 
167e0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
167f0 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20  (jfd, *pOffset, 
16800 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
16810 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16820 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
16830 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
16840 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70  d, (u8*)aData, p
16850 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16860 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a   (*pOffset)+4);.
16870 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16880 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16890 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70  .  *pOffset += p
168a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
168b0 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c  + 4 + isMainJrnl
168c0 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79  *4;..  /* Sanity
168d0 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65   checking on the
168e0 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20   page.  This is 
168f0 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74  more important t
16900 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79  hat I originally
16910 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20  .  ** thought.  
16920 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
16930 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
16940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
16950 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20  eing written,.  
16960 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73  ** it could caus
16970 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74  e invalid data t
16980 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
16990 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  o the journal.  
169a0 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20  We need to.  ** 
169b0 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61  detect this inva
169c0 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68  lid data (with h
169d0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29  igh probability)
169e0 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
169f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
16a00 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
16a10 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
16a20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
16a30 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20   !isSavepnt );. 
16a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16a50 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28  _DONE;.  }.  if(
16a60 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
16a70 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71  er->dbSize || sq
16a80 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
16a90 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a  pDone, pgno) ){.
16aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16ab0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
16ac0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16ad0 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16ae0 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74  s(jfd, (*pOffset
16af0 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  )-4, &cksum);.  
16b00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
16b10 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69  n rc;.    if( !i
16b20 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65  sSavepnt && page
16b30 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
16b40 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73  (u8*)aData)!=cks
16b50 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
16b60 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
16b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16b80 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73  If this page has
16b90 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c   already been pl
16ba0 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65  ayed back before
16bb0 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72   during the curr
16bc0 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  ent.  ** rollbac
16bd0 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f  k, then don't bo
16be0 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20  ther to play it 
16bf0 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f  back again..  */
16c00 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
16c10 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
16c20 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
16c30 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
16c50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
16c60 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61   playing back pa
16c70 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68  ge 1, restore th
16c80 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74 69  e nReserve setti
16c90 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  ng.  */.  if( pg
16ca0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d  no==1 && pPager-
16cb0 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a  >nReserve!=((u8*
16cc0 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20  )aData)[20] ){. 
16cd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
16ce0 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74  rve = ((u8*)aDat
16cf0 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65  a)[20];.    page
16d00 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
16d10 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
16d20 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16d30 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65  n CACHEMOD state
16d40 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
16d50 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
16d60 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
16d70 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
16d80 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
16d90 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
16da0 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
16db0 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16dc0 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
16dd0 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
16de0 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
16df0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  se..  **.  ** An
16e00 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
16e10 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66  e above rule: If
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16e30 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
16e40 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65  .  ** and a page
16e50 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67   is moved during
16e60 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
16e70 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20  vacuum then the 
16e80 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f  page may.  ** no
16e90 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65  t be in the page
16ea0 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20  r cache. Later: 
16eb0 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  if a malloc() or
16ec0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
16ed0 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d  .  ** during a M
16ee0 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20  ovepage() call, 
16ef0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
16f00 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  y not be in the 
16f10 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65  cache.  ** eithe
16f20 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74  r. So the condit
16f30 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e  ion described in
16f40 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67   the above parag
16f50 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  raph is not.  **
16f60 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20   assert()able.. 
16f70 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57   **.  ** If in W
16f80 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49  RITER_DBMOD, WRI
16f90 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20  TER_FINISHED or 
16fa0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e  OPEN state, then
16fb0 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a 20   we update the. 
16fc0 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65 20   ** pager cache 
16fd0 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e 64  if it exists and
16fe0 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
16ff0 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
17000 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f   marked .  ** no
17010 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74  t dirty. Since t
17020 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79  his code is only
17030 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41 47   executed in PAG
17040 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f  ER_OPEN state fo
17050 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  r.  ** a hot-jou
17060 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
17070 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
17080 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63 61  that the page-ca
17090 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a  che is empty.  *
170a0 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  * if the pager i
170b0 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e  s in OPEN state.
170c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
170d0 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
170e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
170f0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
17100 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
17110 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
17120 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
17130 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
17140 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17150 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
17160 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
17170 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
17180 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
17190 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
171a0 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
171b0 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
171c0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
171d0 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
171e0 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
171f0 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
17200 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
17210 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17220 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
17230 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
17240 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
17250 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
17260 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
17270 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
17280 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
17290 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
172a0 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
172b0 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
172c0 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
172d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
172e0 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
172f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
17300 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
17310 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
17320 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
17330 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
17340 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
17350 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
17360 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
17370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17380 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
17390 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
173a0 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
173b0 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
173c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
173d0 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
173e0 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
173f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17400 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
17410 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
17420 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
17430 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
17440 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
17450 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
17460 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
17470 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
17480 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
17490 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
174a0 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
174b0 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
174c0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
174d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
174e0 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
174f0 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
17500 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
17510 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
17520 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
17530 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  opened..  */.  i
17540 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
17550 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50  Pager) ){.    pP
17560 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  g = 0;.  }else{.
17570 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
17580 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
17590 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  ger, pgno);.  }.
175a0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
175b0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
175c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
175d0 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
175e0 7c 7c 20 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50  || pPg==0 );.  P
175f0 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59  AGERTRACE(("PLAY
17600 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
17610 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
17620 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47  ,.           PAG
17630 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
17640 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
17650 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
17660 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ize, (u8*)aData)
17670 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73  ,.           (is
17680 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
17690 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
176a0 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
176b0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
176c0 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
176d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
176e0 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70  | (*pOffset <= p
176f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
17710 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67   isSynced = (pPg
17720 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
17730 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45  flags & PGHDR_NE
17740 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20  ED_SYNC));.  }. 
17750 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
17760 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70  er->fd).   && (p
17770 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17780 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
17790 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
177a0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
177b0 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a  .   && isSynced.
177c0 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
177d0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
177e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177f0 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ze;.    testcase
17800 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17810 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e  pPg!=0 && (pPg->
17820 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
17830 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20  _SYNC)!=0 );.   
17840 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
17850 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
17860 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17870 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17880 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
17890 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
178a0 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
178b0 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
178c0 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
178d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
178e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
178f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
17900 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
17910 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
17920 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
17930 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
17940 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
17950 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
17960 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
17970 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
17980 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
17990 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
179a0 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
179b0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
179c0 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  KPT, aData);.   
179d0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
179e0 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
179f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17a00 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17a10 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17a20 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17a30 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17a40 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17a50 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
17a60 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
17a70 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
17a80 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
17a90 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
17aa0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
17ab0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17ac0 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17ad0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17ae0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17af0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17b00 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17b10 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17b20 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17b30 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17b40 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17b50 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
17b60 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
17b70 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
17b80 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
17b90 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
17ba0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
17bb0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17bc0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17bd0 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17be0 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17bf0 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17c00 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17c10 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17c20 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17c30 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17c40 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17c50 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
17c60 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
17c70 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
17c80 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
17c90 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
17ca0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
17cb0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17cc0 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17cd0 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17ce0 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17cf0 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17d00 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17d10 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17d20 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17d30 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17d40 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17d50 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
17d60 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
17d70 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17d80 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
17d90 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
17da0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17db0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17dc0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17dd0 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17de0 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17df0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
17e00 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17e10 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  g, 1);.    asser
17e20 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  t( (pPager->doNo
17e30 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
17e40 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20  AG_ROLLBACK)!=0 
17e50 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
17e60 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
17e70 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
17e80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17e90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17ea0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
17eb0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
17ec0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
17ed0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
17ee0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17ef0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17f00 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17f10 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17f20 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17f30 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17f40 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17f50 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17f60 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17f70 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17f80 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
17f90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
17fa0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
17fb0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
17fc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
17fd0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
17fe0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17ff0 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18000 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18010 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18020 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18030 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18040 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18050 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18060 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18070 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18080 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18090 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
180a0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
180b0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
180c0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
180d0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
180e0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
180f0 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
18100 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
18110 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
18120 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
18130 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
18140 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
18150 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
18160 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
18170 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
18180 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
18190 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
181a0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
181b0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
181c0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
181d0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
181e0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
181f0 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
18200 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
18210 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
18220 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
18230 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
18240 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
18250 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
18260 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
18270 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
18280 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
18290 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
182a0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
182b0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
182c0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
182d0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
182e0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
182f0 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
18300 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
18310 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
18320 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
18330 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
18340 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
18350 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
18360 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
18370 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
18380 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
18390 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
183a0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
183b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
183c0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
183d0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
183e0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
183f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
18400 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
18410 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
18420 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
18430 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
18440 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
18450 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
18460 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
18470 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
18480 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
18490 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
184a0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
184b0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
184c0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
184d0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
184e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
184f0 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
18500 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
18510 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
18520 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
18530 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
18540 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
18550 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
18560 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
18570 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
18580 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
18590 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
185a0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
185b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
185c0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
185d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
185e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
185f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
18600 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
18610 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
18620 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
18630 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
18640 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
18650 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
18660 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
18670 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
18680 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
18690 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
186a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
186b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
186c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
186d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
186e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
186f0 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
18700 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
18710 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
18720 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
18730 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18740 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
18750 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
18770 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
18780 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
18790 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
187a0 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
187b0 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
187c0 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
187d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187e0 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
187f0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
18800 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18810 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
18820 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
18830 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
18840 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
18850 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
18860 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  is..**.** Argume
18870 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70  nt zMaster may p
18880 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54  oint to Pager.pT
18890 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74  mpSpace. So that
188a0 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a   buffer is not .
188b0 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ** available for
188c0 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73   use within this
188d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
188e0 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a   When a master j
188f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
18900 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f  reated, it is po
18910 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65  pulated with the
18920 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c   names .** of al
18930 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a  l of its child j
18940 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74  ournals, one aft
18950 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d  er another, form
18960 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a  atted as utf-8 .
18970 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e  ** encoded text.
18980 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   The end of each
18990 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66   child journal f
189a0 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69  ile is marked wi
189b0 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72  th a .** nul-ter
189c0 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78  minator byte (0x
189d0 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e  00). i.e. the en
189e0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
189f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18a00 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20  l.** file for a 
18a10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f  transaction invo
18a20 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61  lving two databa
18a30 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a  ses might be:.**
18a40 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c  .**   "/home/bil
18a50 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/a.db-journal\x
18a60 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64  00/home/bill/b.d
18a70 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a  b-journal\x00".*
18a80 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f  *.** A master jo
18a90 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
18aa0 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f  nly be deleted o
18ab0 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63  nce all of its c
18ac0 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  hild .** journal
18ad0 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c  s have been roll
18ae0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
18af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61  his function rea
18b00 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ds the contents 
18b10 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
18b20 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
18b30 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c  .** memory and l
18b40 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63  oops through eac
18b50 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a  h of the child j
18b60 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f  ournal names. Fo
18b70 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20  r.** each child 
18b80 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63  journal, it chec
18b90 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ks if:.**.**   *
18ba0 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   if the child jo
18bb0 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e  urnal exists, an
18bc0 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69  d if so.**   * i
18bd0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18be0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  nal contains a r
18bf0 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74  eference to mast
18c00 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20  er journal .**  
18c10 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a     file zMaster.
18c20 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64  **.** If a child
18c30 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
18c40 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68  found that match
18c50 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63  es both of the c
18c60 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65  riteria.** above
18c70 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18c80 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20  returns without 
18c90 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
18ca0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a  Otherwise, if.**
18cb0 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a   no such child j
18cc0 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
18cd0 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65  und, file zMaste
18ce0 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  r is deleted fro
18cf0 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  m.** the file-sy
18d00 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74  stem using sqlit
18d10 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
18d20 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
18d30 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  or within this f
18d40 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f  unction, an erro
18d50 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18d60 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
18d70 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d  tion allocates m
18d80 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67  emory by calling
18d90 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29   sqlite3Malloc()
18da0 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69  . If an allocati
18db0 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  on.** fails, SQL
18dc0 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
18dd0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18de0 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61  , if no IO or ma
18df0 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20  lloc errors .** 
18e00 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b  occur, SQLITE_OK
18e10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
18e20 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66  .** TODO: This f
18e30 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
18e40 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b  s a single block
18e50 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f   of memory to lo
18e60 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ad.** the entire
18e70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18e80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18e90 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64  file. This could
18ea0 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20   be.** a couple 
18eb0 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20  of kilobytes or 
18ec0 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79  so - potentially
18ed0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
18ee0 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a   page .** size..
18ef0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
18f00 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
18f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
18f20 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
18f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
18f40 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
18f50 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
18f80 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
18f90 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20  ile *pMaster;   
18fa0 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73   /* Malloc'd mas
18fb0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
18fc0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18fd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
18fe0 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61  Journal;   /* Ma
18ff0 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75  lloc'd child-jou
19000 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
19010 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ptor */.  char *
19020 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
19030 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
19040 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
19050 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
19060 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
19070 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19080 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19090 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
190a0 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
190b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
190c0 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69  o one journal wi
190d0 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a  thin MJ file */.
190e0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
190f0 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  tr;         /* S
19100 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20  pace to hold MJ 
19110 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20  filename from a 
19120 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
19130 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
19140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
19150 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61  mount of space a
19160 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73  llocated to zMas
19170 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f  terPtr[] */..  /
19180 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
19190 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a   for both the pJ
191a0 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74  ournal and pMast
191b0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
191c0 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63  ors..  ** If suc
191d0 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68  cessful, open th
191e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
191f0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
19200 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65  g..  */.  pMaste
19210 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  r = (sqlite3_fil
19220 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e *)sqlite3Mallo
19230 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73  cZero(pVfs->szOs
19240 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f  File * 2);.  pJo
19250 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33  urnal = (sqlite3
19260 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29  _file *)(((u8 *)
19270 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d  pMaster) + pVfs-
19280 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66  >szOsFile);.  if
19290 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !pMaster ){.  
192a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
192b0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73  MEM_BKPT;.  }els
192c0 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
192d0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
192e0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
192f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
19300 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
19310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
19320 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
19330 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
19340 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
19350 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19360 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19370 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74  ut;..  /* Load t
19380 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
19390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
193a0 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
193b0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69  d from.  ** sqli
193c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
193d0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
193e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20  MasterJournal.  
193f0 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a   Also obtain.  *
19400 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  * sufficient spa
19410 63 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74  ce (in zMasterPt
19420 72 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  r) to hold the n
19430 61 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20  ames of master. 
19440 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
19450 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
19460 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63   regular rollbac
19470 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  k-journals..  */
19480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
19490 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
194a0 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
194b0 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
194c0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
194d0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
194e0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
194f0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
19500 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
19510 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  al = sqlite3Mall
19520 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
19530 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b  l + nMasterPtr +
19540 20 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73   1);.  if( !zMas
19550 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
19560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19570 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  MEM_BKPT;.    go
19580 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19590 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50  ;.  }.  zMasterP
195a0 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75  tr = &zMasterJou
195b0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
195c0 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73  nal+1];.  rc = s
195d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
195e0 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
195f0 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74  rnal, (int)nMast
19600 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  erJournal, 0);. 
19610 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19620 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19630 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74  ter_out;.  zMast
19640 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
19650 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a  rJournal] = 0;..
19660 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
19670 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77  sterJournal;.  w
19680 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
19690 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
196a0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
196b0 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73  {.    int exists
196c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
196d0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
196e0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
196f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
19700 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69   &exists);.    i
19710 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19720 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64   ){.      goto d
19730 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19740 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73    }.    if( exis
19750 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ts ){.      /* O
19760 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
19770 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
19780 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19790 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
197a0 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
197b0 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
197c0 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
197d0 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
197e0 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
197f0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
19800 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
19810 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
19820 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63    */.      int c
19830 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
19840 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
19850 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19860 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
19870 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  AL);.      rc = 
19880 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
19890 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a  fs, zJournal, pJ
198a0 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30  ournal, flags, 0
198b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
198c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
198d0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
198e0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
198f0 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  }..      rc = re
19900 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
19910 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
19920 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
19930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19940 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
19950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19970 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
19980 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
19990 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  }..      c = zMa
199a0 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
199b0 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
199c0 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
199d0 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a  .      if( c ){.
199e0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
199f0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
19a00 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
19a10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19a20 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f  e. */.        go
19a30 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a50 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
19a60 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  (sqlite3Strlen30
19a70 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
19a80 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73   }. .  sqlite3Os
19a90 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
19aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19ab0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
19ac0 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
19ad0 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  ster_out:.  sqli
19ae0 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
19af0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
19b00 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73  pMaster ){.    s
19b10 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
19b20 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
19b30 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75  rt( !isOpen(pJou
19b40 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c  rnal) );.    sql
19b50 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65  ite3_free(pMaste
19b60 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
19b70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
19b80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19b90 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
19ba0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
19bb0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
19bc0 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
19bd0 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
19be0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
19bf0 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
19c00 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
19c10 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
19c20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
19c30 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
19c40 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
19c50 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
19c60 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
19c70 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
19c80 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20  n, or the pager 
19c90 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72  is not in either
19ca0 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45  .** DBMOD or OPE
19cb0 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  N state, this fu
19cc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
19cd0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
19ce0 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68  e size .** of th
19cf0 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65  e file is change
19d00 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
19d10 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
19d20 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
19d30 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65   .** If the file
19d40 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72   on disk is curr
19d50 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ently larger tha
19d60 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74  n nPage pages, t
19d70 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a  hen use the VFS.
19d80 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d  ** xTruncate() m
19d90 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74  ethod to truncat
19da0 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  e it..**.** Or, 
19db0 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  it might be the 
19dc0 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
19dd0 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
19de0 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e  aller than .** n
19df0 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65  Page pages. Some
19e00 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
19e10 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  m implementation
19e20 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73  s can get confus
19e30 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72  ed if .** you tr
19e40 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20  y to truncate a 
19e50 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
19e60 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
19e70 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72   than it .** cur
19e80 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65  rently is, so de
19e90 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
19ea0 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c  nd write a singl
19eb0 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a  e zero byte to .
19ec0 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ** the end of th
19ed0 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65  e new file inste
19ee0 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ad..**.** If suc
19ef0 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
19f00 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
19f10 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
19f20 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67   while modifying
19f30 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
19f40 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68   file, return th
19f50 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
19f60 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
19f70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
19f80 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
19f90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
19fa0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
19fb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
19fc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19fd0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
19fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19ff0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1a000 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
1a010 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
1a020 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26  ager->fd) .   &&
1a030 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
1a040 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  >=PAGER_WRITER_D
1a050 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  BMOD || pPager->
1a060 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1a070 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36  EN) .  ){.    i6
1a080 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
1a090 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  ewSize;.    int 
1a0a0 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
1a0b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61  >pageSize;.    a
1a0c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1a0d0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1a0e0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54  LOCK );.    /* T
1a0f0 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20  ODO: Is it safe 
1a100 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46  to use Pager.dbF
1a110 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f  ileSize here? */
1a120 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1a140 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74  er->fd, &current
1a150 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69  Size);.    newSi
1a160 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34  ze = szPage*(i64
1a170 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
1a180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1a190 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
1a1a0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
1a1b0 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
1a1c0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a1d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a1e0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1a1f0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
1a200 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1a210 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61  currentSize+szPa
1a220 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ge)<=newSize ){.
1a230 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54          char *pT
1a240 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  mp = pPager->pTm
1a250 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20  pSpace;.        
1a260 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20  memset(pTmp, 0, 
1a270 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  szPage);.       
1a280 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1a290 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63  ize-szPage) == c
1a2a0 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1a2b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a2c0 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
1a2d0 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20   >  currentSize 
1a2e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1a2f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1a300 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c  Pager->fd, pTmp,
1a310 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65   szPage, newSize
1a320 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20  -szPage);.      
1a330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1a340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a350 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
1a360 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
1a370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a3a0 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73  a sanitized vers
1a3b0 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ion of the secto
1a3c0 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c  r-size of OS fil
1a3d0 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20  e pFile. The.** 
1a3e0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a3f0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69  guaranteed to li
1a400 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64  e between 32 and
1a410 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a420 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a430 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1a440 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
1a450 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71  .  int iRet = sq
1a460 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1a470 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  e(pFile);.  if( 
1a480 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69  iRet<32 ){.    i
1a490 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  Ret = 512;.  }el
1a4a0 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f  se if( iRet>MAX_
1a4b0 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20  SECTOR_SIZE ){. 
1a4c0 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53     assert( MAX_S
1a4d0 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20  ECTOR_SIZE>=512 
1a4e0 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41  );.    iRet = MA
1a4f0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  X_SECTOR_SIZE;. 
1a500 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74   }.  return iRet
1a510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1a520 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1a530 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1a540 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
1a550 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
1a560 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
1a570 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a580 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
1a590 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
1a5a0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
1a5b0 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
1a5c0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
1a5d0 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
1a5e0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
1a5f0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
1a600 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
1a610 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1a620 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
1a630 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
1a640 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1a650 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
1a660 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
1a670 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a680 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1a690 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
1a6a0 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
1a6b0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
1a6c0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a6d0 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
1a6e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a6f0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a700 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
1a710 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
1a720 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
1a730 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
1a740 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
1a750 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
1a760 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
1a770 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
1a780 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
1a790 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
1a7a0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1a7b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
1a7c0 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
1a7d0 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
1a7e0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
1a7f0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
1a800 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
1a810 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
1a820 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1a830 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
1a840 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
1a850 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
1a860 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
1a870 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
1a880 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
1a890 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
1a8a0 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
1a8b0 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
1a8c0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
1a8d0 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
1a8e0 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
1a8f0 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
1a900 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
1a910 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
1a920 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
1a930 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
1a940 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
1a950 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
1a960 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
1a970 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
1a980 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
1a990 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a9a0 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
1a9b0 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
1a9c0 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
1a9d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1a9e0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
1a9f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
1aa00 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
1aa10 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
1aa20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
1aa30 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
1aa40 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1aa50 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
1aa60 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
1aa70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1aa80 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1aa90 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
1aaa0 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
1aab0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
1aac0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1aad0 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
1aae0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
1aaf0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
1ab00 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
1ab10 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
1ab20 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
1ab30 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
1ab40 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
1ab50 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
1ab60 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
1ab70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1ab80 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74  ze = sqlite3Sect
1ab90 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
1aba0 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1abb0 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
1abc0 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
1abd0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
1abe0 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
1abf0 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
1ac00 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
1ac10 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
1ac20 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
1ac30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1ac40 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
1ac50 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
1ac60 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
1ac70 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
1ac80 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
1ac90 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
1aca0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1acb0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1acc0 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
1acd0 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
1ace0 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
1acf0 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
1ad00 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
1ad10 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
1ad20 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
1ad30 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
1ad40 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1ad50 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
1ad60 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
1ad70 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
1ad80 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1ad90 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
1ada0 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
1adb0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
1adc0 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
1add0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
1ade0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
1adf0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
1ae00 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
1ae10 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
1ae20 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
1ae30 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1ae40 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1ae50 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
1ae60 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
1ae70 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
1ae80 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
1ae90 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
1aea0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1aeb0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1aec0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
1aed0 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64  *  (7)  zero pad
1aee0 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20  ding out to the 
1aef0 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65  next sector size
1af00 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20  ..**  (8)  Zero 
1af10 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
1af20 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
1af30 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
1af40 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
1af50 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
1af60 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
1af70 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
1af80 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
1af90 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
1afa0 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
1afb0 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
1afc0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
1afd0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
1afe0 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 7 items above.
1aff0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
1b000 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b010 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1b020 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 8th item..**
1b030 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
1b040 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
1b050 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
1b060 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
1b070 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
1b080 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
1b090 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b0a0 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
1b0b0 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
1b0c0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
1b0d0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
1b0e0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b0f0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
1b100 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
1b110 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
1b120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b130 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1b140 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
1b150 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
1b160 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
1b170 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
1b180 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1b190 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
1b1a0 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
1b1b0 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
1b1c0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
1b1d0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
1b1e0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
1b1f0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
1b200 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
1b210 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
1b220 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
1b230 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
1b240 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
1b250 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
1b260 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
1b270 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
1b280 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
1b290 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
1b2a0 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
1b2b0 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
1b2c0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
1b2d0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
1b2e0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
1b2f0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
1b300 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
1b310 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
1b320 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
1b330 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
1b340 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
1b350 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
1b360 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
1b370 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
1b380 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
1b390 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
1b3a0 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
1b3b0 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
1b3c0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
1b3d0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
1b3e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b3f0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
1b400 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
1b410 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
1b420 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
1b430 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
1b440 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
1b450 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
1b460 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
1b470 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
1b480 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
1b490 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
1b4a0 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
1b4b0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1b4c0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
1b4d0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
1b4e0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
1b4f0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
1b500 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
1b510 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
1b520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
1b530 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
1b540 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1b550 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1b560 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
1b570 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
1b580 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
1b590 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
1b5a0 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
1b5b0 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
1b5c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
1b5d0 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
1b5e0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1b5f0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
1b600 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
1b610 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1b620 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
1b630 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
1b640 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
1b650 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
1b660 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
1b670 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
1b680 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
1b690 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
1b6a0 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
1b6b0 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
1b6c0 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
1b6d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b6e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
1b6f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1b700 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
1b710 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1b720 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1b730 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
1b740 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b750 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b760 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1b770 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
1b780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b790 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
1b7a0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b7b0 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b7d0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1b7e0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
1b7f0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
1b800 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b810 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
1b820 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
1b830 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1b840 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1b850 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
1b860 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
1b870 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
1b880 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1b890 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1b8a0 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
1b8b0 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
1b8c0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
1b8d0 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
1b8e0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
1b8f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
1b900 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
1b910 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
1b920 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
1b930 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
1b940 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79  k */.  int nPlay
1b950 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  back = 0;       
1b960 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1b970 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65  of pages restore
1b980 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
1b990 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1b9a0 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1b9b0 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1b9c0 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1b9d0 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1b9e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1b9f0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1ba00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1ba10 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1ba20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1ba30 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1ba40 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1ba50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ba60 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1ba70 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1ba80 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1ba90 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1baa0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1bab0 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1bac0 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1bad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1bae0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1baf0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1bb00 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1bb10 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1bb20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1bb30 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1bb40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1bb50 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1bb60 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1bb70 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1bb80 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1bb90 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1bba0 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1bbb0 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1bbc0 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1bbd0 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1bbe0 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1bbf0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1bc00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1bc10 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1bc20 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1bc30 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1bc40 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69   ** mxPathname i
1bc50 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1bc60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1bc70 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1bc80 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1bc90 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1bca0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1bcb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1bcc0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1bcd0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1bce0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1bcf0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1bd00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1bd10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1bd20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1bd30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bd40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1bd50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1bd60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1bd70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1bd80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1bd90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1bda0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bdb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bdc0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bdd0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bde0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1bdf0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1be00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1be10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1be20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1be30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1be40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1be50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1be60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1be70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1be80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1be90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bea0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1beb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bec0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bed0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bee0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bef0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bf00 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bf10 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bf20 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bf30 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bf40 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bf50 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bf60 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bf70 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bf80 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bf90 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bfa0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bfb0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bfc0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bfd0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bfe0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bff0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1c000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c010 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1c020 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1c030 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c040 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1c050 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c060 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1c070 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1c080 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1c090 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1c0a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1c0b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1c0c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1c0d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1c0e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1c0f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c100 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1c110 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1c120 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1c130 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1c140 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1c150 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1c160 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1c170 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1c180 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1c190 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1c1a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c1b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c1c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1c1d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1c1e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c1f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1c200 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1c210 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c220 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c230 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1c240 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1c250 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1c260 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1c270 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1c280 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1c290 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1c2a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1c2b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1c2c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1c2d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1c2e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1c2f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c300 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c310 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c320 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c330 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c340 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c350 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c360 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c370 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c380 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c390 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c3a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c3b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c3c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c3d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c3e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c3f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c400 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c410 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c420 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c430 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c440 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c450 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c460 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c470 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c480 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c490 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c4a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c4b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c4c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c4d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c4e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c4f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c500 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c520 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c530 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c540 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c550 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c560 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c570 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c580 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c590 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c5a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c5b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c5c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c5d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c5e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c5f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c600 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c610 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c620 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c630 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c640 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c650 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c660 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c670 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c680 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c6a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c6b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c6c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c6d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c6e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c6f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c710 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c720 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c730 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c740 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c750 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c760 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c770 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c780 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c790 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c7a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c7b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c7c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c7d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c7e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c7f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c800 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c820 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c830 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c840 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c850 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c860 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c880 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c8a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c8b0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c8d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c8f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c900 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c920 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c940 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c950 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c960 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c970 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c980 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c990 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c9a0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c9b0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c9c0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c9d0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c9e0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c9f0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1ca00 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1ca10 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1ca20 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1ca30 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1ca40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1ca50 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1ca60 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1ca70 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1ca80 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1ca90 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1caa0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1cab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1cac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cad0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1cae0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1caf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cb00 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1cb10 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1cb20 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1cb30 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1cb40 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1cb50 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1cb60 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1cb70 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1cb80 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1cb90 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1cba0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1cbb0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1cbc0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1cbd0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1cbe0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1cbf0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1cc00 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1cc10 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1cc20 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1cc30 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cc50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1cc60 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1cc70 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1cc80 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1cc90 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1cca0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1ccb0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1ccc0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1ccd0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1cce0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1ccf0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1cd00 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1cd10 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1cd20 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1cd30 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1cd40 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1cd50 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1cd60 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1cd70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1cd80 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1cd90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1cda0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cdb0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cdc0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cdd0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cde0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1cdf0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1ce00 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1ce10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ce20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1ce30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1ce40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1ce50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1ce60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1ce70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1ce80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1ce90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cea0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1ceb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cec0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1ced0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cee0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cef0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cf00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cf10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cf20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cf30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cf40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cf50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cf60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cf70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cf80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cf90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cfa0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1cfb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1cfc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1cfd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cfe0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1cff0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1d000 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1d010 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1d020 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1d030 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1d040 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1d050 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1d060 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1d070 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1d080 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1d090 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1d0a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d0b0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1d0c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1d0d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1d0e0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1d0f0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1d100 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1d110 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1d120 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1d130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1d140 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d150 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1d160 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1d170 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1d180 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1d190 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1d1a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1d1b0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1d1c0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1d1d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d1e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d1f0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1d200 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1d210 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1d220 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d240 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d250 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1d260 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1d270 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1d280 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1d290 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1d2a0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1d2b0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1d2c0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1d2d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1d2e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1d2f0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d300 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d310 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d320 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d330 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d340 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d350 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d360 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d370 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d380 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d390 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d3a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d3b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d3c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d3d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d3e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d3f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d400 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d410 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d420 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d430 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d440 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d450 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d460 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d470 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d480 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d490 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d4a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d4b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d4c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d4d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d4e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d4f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d500 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d510 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d520 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d530 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d540 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d550 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d560 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d570 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d580 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d590 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d5a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d5b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d5c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d5d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d5e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d5f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d600 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d610 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d620 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d630 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d650 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d660 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d670 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d680 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d690 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d6a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d6b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d6c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d6d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d6e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d6f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d700 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d710 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d720 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d740 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d750 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d760 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d770 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d790 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d7a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d7b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d7c0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d7d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d7e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d7f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d800 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d810 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d820 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d830 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d840 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d850 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d860 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d870 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d880 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d890 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d8a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d8b0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d8c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d8d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d8f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d900 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d910 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d930 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d950 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d960 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d970 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d980 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d990 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d9a0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d9b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d9c0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d9d0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d9e0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d9f0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1da00 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1da10 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1da20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1da30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1da40 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1da50 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1da60 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1da70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1da80 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1da90 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1daa0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1dab0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1dac0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1dad0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1dae0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1daf0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1db00 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1db10 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1db20 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1db30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1db40 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1db50 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1db60 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1db70 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1db80 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1db90 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1dba0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1dbb0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1dbc0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1dbd0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1dbe0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1dbf0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1dc00 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1dc10 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1dc20 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1dc30 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1dc40 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1dc50 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1dc60 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1dc70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dc80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dc90 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1dca0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1dcb0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1dcc0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1dcd0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1dce0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1dcf0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1dd00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1dd10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1dd20 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1dd30 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1dd40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1dd50 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1dd60 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1dd70 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1dd80 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1dd90 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1dda0 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1ddb0 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
1ddc0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
1ddd0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
1dde0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1ddf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1de00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1de10 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1de20 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
1de30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1de40 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
1de50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68   value of the ch
1de60 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1de70 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39  offsets 24 and 9
1de80 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64  2 in.** the head
1de90 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  er and the sqlit
1dea0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1deb0 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a   at offset 96..*
1dec0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20  *.** This is an 
1ded0 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70  unconditional up
1dee0 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20  date.  See also 
1def0 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  the pager_incr_c
1df00 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a  hangecounter().*
1df10 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20  * routine which 
1df20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65  only updates the
1df30 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1df40 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73  if the update is
1df50 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65   actually.** nee
1df60 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e  ded, as determin
1df70 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72  ed by the pPager
1df80 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1df90 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65  e state variable
1dfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1dfb0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1dfc0 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72  ngecounter(PgHdr
1dfd0 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68   *pPg){.  u32 ch
1dfe0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20  ange_counter;.. 
1dff0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1e000 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
1e010 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
1e020 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
1e030 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
1e040 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e050 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e  4byte((u8*)pPg->
1e060 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e070 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69  rs)+1;.  put32bi
1e080 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1e090 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67  pData)+24, chang
1e0a0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f  e_counter);..  /
1e0b0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
1e0c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
1e0d0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
1e0e0 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
1e0f0 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20  ** bytes 92..95 
1e100 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65  store the change
1e110 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69   counter for whi
1e120 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e  ch the version n
1e130 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61  umber.  ** is va
1e140 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62  lid. */.  put32b
1e150 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e160 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e  >pData)+92, chan
1e170 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70  ge_counter);.  p
1e180 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1e190 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c  )pPg->pData)+96,
1e1a0 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
1e1b0 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e  NUMBER);.}..#ifn
1e1c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e1d0 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
1e1e0 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
1e1f0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1e200 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
1e210 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
1e220 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1e230 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
1e240 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1e250 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
1e260 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
1e270 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
1e280 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
1e290 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
1e2a0 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
1e2b0 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
1e2c0 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
1e2d0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
1e2e0 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
1e2f0 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
1e300 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
1e310 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
1e320 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
1e330 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
1e340 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
1e350 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
1e360 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
1e370 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
1e380 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
1e390 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
1e3a0 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
1e3b0 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
1e3c0 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
1e3d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1e3e0 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
1e3f0 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
1e400 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1e410 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
1e420 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
1e430 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
1e440 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
1e450 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
1e460 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e480 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
1e490 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
1e4a0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
1e4b0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1e4c0 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20  Pager) );.  pPg 
1e4d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
1e4e0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67  okup(pPager, iPg
1e4f0 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
1e500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
1e510 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
1e520 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20  t(pPg)==1 ){.   
1e530 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1e540 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d  Drop(pPg);.    }
1e550 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20  else{.      u32 
1e560 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  iFrame = 0;.    
1e570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e580 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
1e590 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67  r->pWal, pPg->pg
1e5a0 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20  no, &iFrame);.  
1e5b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e5c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e5d0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1e5e0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
1e5f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e610 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1e620 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1e630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1e650 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20  fNotNull(pPg);. 
1e660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
1e670 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72  ormally, if a tr
1e680 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1e690 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61  led back, any ba
1e6a0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61  ckup processes a
1e6b0 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20  re.  ** updated 
1e6c0 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65  as data is copie
1e6d0 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c  d out of the rol
1e6e0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
1e6f0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  d into the.  ** 
1e700 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69  database. This i
1e710 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20  s not generally 
1e720 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20  possible with a 
1e730 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73  WAL database, as
1e740 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69  .  ** rollback i
1e750 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74  nvolves simply t
1e760 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f  runcating the lo
1e770 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  g file. Therefor
1e780 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f  e, if one.  ** o
1e790 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61  r more frames ha
1e7a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
1e7b0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
1e7c0 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  og (and therefor
1e7d0 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70  e .  ** also cop
1e7e0 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63  ied into the bac
1e7f0 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61  kup databases) a
1e800 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74  s part of this t
1e810 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a  ransaction,.  **
1e820 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73   the backups mus
1e830 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  t be restarted..
1e840 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61    */.  sqlite3Ba
1e850 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
1e860 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20  er->pBackup);.. 
1e870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e880 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e890 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1e8a0 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  rollback a trans
1e8b0 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20  action on a WAL 
1e8c0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e8d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c  tic int pagerRol
1e8e0 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a  lbackWal(Pager *
1e8f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1e900 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1e910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e920 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
1e930 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20  gHdr *pList;    
1e940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e950 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20  * List of dirty 
1e960 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20  pages to revert 
1e970 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c  */..  /* For all
1e980 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e990 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72  che that are cur
1e9a0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20  rently dirty or 
1e9b0 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a  have already.  *
1e9c0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28  * been written (
1e9d0 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65  but not committe
1e9e0 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  d) to the log fi
1e9f0 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68  le, do one of th
1ea00 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  e .  ** followin
1ea10 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b  g:.  **.  **   +
1ea20 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63   Discard the cac
1ea30 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66  hed page (if ref
1ea40 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20  count==0), or.  
1ea50 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61  **   + Reload pa
1ea60 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ge content from 
1ea70 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66  the database (if
1ea80 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20   refcount>0)..  
1ea90 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
1eaa0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1eab0 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d  OrigSize;.  rc =
1eac0 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28   sqlite3WalUndo(
1ead0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61  pPager->pWal, pa
1eae0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c  gerUndoCallback,
1eaf0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29   (void *)pPager)
1eb00 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
1eb10 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1eb20 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1eb30 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c  he);.  while( pL
1eb40 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ist && rc==SQLIT
1eb50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64  E_OK ){.    PgHd
1eb60 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74  r *pNext = pList
1eb70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63  ->pDirty;.    rc
1eb80 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c   = pagerUndoCall
1eb90 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61  back((void *)pPa
1eba0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1ebb0 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
1ebc0 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Next;.  }..  ret
1ebd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ebe0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ebf0 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
1ec00 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61  nd sqlite3WalFra
1ec10 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61  mes(). As well a
1ec20 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65  s logging.** the
1ec30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ec40 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68   list of pages h
1ec50 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28  eaded by pList (
1ec60 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
1ec70 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75  rty),.** this fu
1ec80 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20  nction notifies 
1ec90 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75  any active backu
1eca0 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74  p processes that
1ecb0 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a   the pages have.
1ecc0 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a  ** changed. .**.
1ecd0 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70  ** The list of p
1ece0 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f  ages passed into
1ecf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1ed00 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62   always sorted b
1ed10 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  y page number..*
1ed20 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65  * Hence, if page
1ed30 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68   1 appears anywh
1ed40 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c  ere on the list,
1ed50 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20   it will be the 
1ed60 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a  first page..*/ .
1ed70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ed80 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67  WalFrames(.  Pag
1ed90 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1edb0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1edc0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20    PgHdr *pList, 
1edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ede0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61    /* List of fra
1edf0 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20  mes to log */.  
1ee00 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20  Pgno nTruncate, 
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65  /* Database size
1ee30 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d   after this comm
1ee40 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  it */.  int isCo
1ee50 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1ee60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ee70 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d  if this is a com
1ee80 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  mit */.){.  int 
1ee90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1eea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1eeb0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1eec0 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20  int nList;      
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1eef0 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20  es in pList */. 
1ef00 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20   PgHdr *p;      
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1ef30 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20  over pages */.. 
1ef40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ef50 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  >pWal );.  asser
1ef60 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64  t( pList );.#ifd
1ef70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1ef80 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1ef90 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1efa0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1efb0 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1efc0 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1efd0 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1efe0 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1eff0 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1f000 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1f010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
1f020 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  rt( pList->pDirt
1f030 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74  y==0 || isCommit
1f040 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d   );.  if( isComm
1f050 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  it ){.    /* If 
1f060 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1f070 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69  n is being commi
1f080 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e  tted, there is n
1f090 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69  o point in writi
1f0a0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61  ng.    ** any pa
1f0b0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
1f0c0 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68  mbers greater th
1f0d0 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74  an nTruncate int
1f0e0 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a  o the WAL file..
1f0f0 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c      ** They will
1f100 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62   never be read b
1f110 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f  y any client. So
1f120 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1f130 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20  m the pDirty.   
1f140 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a   ** list here. *
1f150 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70  /.    PgHdr **pp
1f160 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20  Next = &pList;. 
1f170 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20     nList = 0;.  
1f180 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28    for(p=pList; (
1f190 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b  *ppNext = p)!=0;
1f1a0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f1b0 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
1f1c0 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  <=nTruncate ){. 
1f1d0 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20         ppNext = 
1f1e0 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  &p->pDirty;.    
1f1f0 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20      nList++;.   
1f200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
1f210 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1f220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69    }else{.    nLi
1f230 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50  st = 1;.  }.  pP
1f240 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
1f250 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d  R_STAT_WRITE] +=
1f260 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70   nList;..  if( p
1f270 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20  List->pgno==1 ) 
1f280 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1f290 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29  gecounter(pList)
1f2a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f2b0 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
1f2c0 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70  ->pWal, .      p
1f2d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
1f2e0 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74   pList, nTruncat
1f2f0 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61  e, isCommit, pPa
1f300 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
1f310 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  s.  );.  if( rc=
1f320 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1f330 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
1f340 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f350 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f360 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f370 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1f380 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1f390 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1f3a0 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1f3b0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f3c0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1f3d0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1f3e0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f3f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f400 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f410 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f420 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1f430 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1f440 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1f450 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1f460 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1f470 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1f480 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1f490 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1f4a0 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1f4b0 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1f4c0 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1f4d0 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1f4e0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1f4f0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1f500 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1f510 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1f520 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1f530 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1f540 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1f550 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1f560 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1f570 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1f580 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1f590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f5a0 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1f5b0 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1f5c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1f5d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1f5e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1f5f0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1f600 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f620 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1f630 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1f640 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1f650 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1f660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f670 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f680 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1f690 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1f6a0 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1f6b0 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1f6c0 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1f6d0 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1f6e0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1f6f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f700 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1f710 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1f720 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1f730 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1f740 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1f750 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1f760 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1f770 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1f780 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1f790 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1f7a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1f7b0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1f7c0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1f7d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f7e0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1f7f0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1f800 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1f810 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1f820 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1f830 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1f840 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1f850 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
1f860 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
1f870 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
1f880 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
1f890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1f8a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1f8b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f8c0 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1f8d0 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1f8e0 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1f8f0 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1f900 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1f910 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1f920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f930 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1f940 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1f950 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1f960 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1f970 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1f980 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1f990 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1f9a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f9b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f9c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1f9d0 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1f9e0 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1f9f0 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1fa00 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1fa10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1fa20 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1fa30 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1fa40 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1fa50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1fa60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1fa70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1fa80 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1fa90 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fab0 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1fac0 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1fad0 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1fae0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1faf0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1fb00 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1fb10 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1fb20 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1fb30 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1fb40 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1fb50 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1fb60 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1fb70 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1fb80 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1fb90 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1fba0 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1fbb0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1fbc0 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1fbd0 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1fbe0 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1fbf0 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1fc00 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1fc10 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1fc20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1fc30 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1fc40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1fc50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1fc60 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50  RED_LOCK );.  nP
1fc70 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  age = sqlite3Wal
1fc80 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  Dbsize(pPager->p
1fc90 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Wal);..  /* If t
1fca0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1fcb0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
1fcc0 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  se is not availa
1fcd0 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ble from the.  *
1fce0 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  * WAL sub-system
1fcf0 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  , determine the 
1fd00 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65  page counte base
1fd10 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  d on the size of
1fd20 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1fd30 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
1fd40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1fd50 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
1fd60 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65  t an.  ** intege
1fd70 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
1fd80 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75  e page-size, rou
1fd90 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74  nd up the result
1fda0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1fdb0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1fdc0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1fdd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fde0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1fdf0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1fe00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1fe10 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1fe20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1fe30 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1fe40 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1fe50 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1fe60 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1fe70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1fe80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fe90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fea0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1feb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fec0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
1fed0 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
1fee0 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
1fef0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
1ff00 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1ff10 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
1ff20 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
1ff30 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1ff40 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
1ff50 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
1ff60 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
1ff70 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
1ff80 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
1ff90 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
1ffa0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
1ffb0 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
1ffc0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
1ffd0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
1ffe0 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
1fff0 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
20000 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
20010 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20030 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
20040 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
20050 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
20060 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
20070 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
20080 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
20090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
200a0 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
200b0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
200c0 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
200d0 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
200e0 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
200f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20100 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
20110 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20120 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
20130 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
20140 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
20150 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
20160 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
20170 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
20180 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
20190 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
201a0 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
201b0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
201c0 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
201d0 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
201e0 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
201f0 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
20200 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
20210 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
20220 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
20230 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
20240 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
20250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20260 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
20270 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
20280 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
20290 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
202a0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
202b0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
202c0 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
202d0 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
202e0 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
202f0 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
20300 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
20310 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
20320 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
20330 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
20340 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
20350 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
20360 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
20370 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
20380 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
20390 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
203a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
203b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
203c0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
203d0 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
203e0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
203f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
20400 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20410 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20420 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20440 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
20450 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
20460 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20480 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
20490 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
204a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
204b0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
204c0 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
204d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
204e0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
204f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20500 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20510 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20520 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
20530 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20540 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
20550 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
20560 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
20570 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
20580 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20590 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
205a0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
205b0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
205c0 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
205d0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
205e0 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
205f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20610 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20620 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
20630 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
20640 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
20650 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
20660 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20670 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
20680 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
206a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
206b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
206c0 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
206d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
206e0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
206f0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
20700 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20710 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20720 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20730 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
20740 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
20750 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
20760 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
20770 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
20780 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
20790 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
207a0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
207b0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
207c0 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
207d0 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
207e0 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
207f0 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
20800 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
20810 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20820 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20830 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20840 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20850 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20860 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
20870 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
20880 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
20890 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
208a0 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
208b0 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
208c0 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
208d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
208e0 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
208f0 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
20900 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20910 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20920 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20930 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20940 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20950 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20960 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20970 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
20980 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20990 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
209a0 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
209b0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
209c0 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
209d0 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
209e0 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
209f0 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
20a00 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
20a10 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20a20 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20a30 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20a40 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20a50 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20a60 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20a70 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
20a80 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20a90 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
20aa0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
20ab0 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
20ac0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
20ad0 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
20ae0 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
20af0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
20b00 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
20b10 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20b20 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20b40 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20b50 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20b60 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
20b70 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
20b80 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
20b90 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
20ba0 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
20bb0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
20bc0 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
20bd0 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
20be0 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
20bf0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
20c00 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
20c10 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
20c20 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
20c30 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
20c40 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
20c50 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
20c60 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
20c70 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
20c80 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
20c90 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20ca0 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
20cb0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
20cc0 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
20cd0 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
20ce0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
20cf0 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
20d00 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
20d10 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
20d20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
20d30 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
20d40 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
20d50 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
20d60 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
20d70 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
20d80 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
20d90 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
20da0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
20db0 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
20dc0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
20dd0 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
20de0 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
20df0 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
20e00 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20e10 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
20e20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20e30 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
20e40 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
20e50 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
20e60 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
20e70 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20e80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
20e90 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20eb0 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
20ec0 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
20ed0 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
20ee0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20ef0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
20f00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
20f10 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
20f20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
20f30 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
20f40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
20f50 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
20f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20f70 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
20f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20f90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
20fa0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
20fb0 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
20fc0 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
20fd0 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
20fe0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
20ff0 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
21000 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21010 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
21020 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
21030 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
21040 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
21050 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
21060 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21070 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
21080 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
21090 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
210a0 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
210b0 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
210c0 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
210d0 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
210e0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
210f0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21100 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
21110 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
21120 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
21130 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
21140 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
21150 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
21160 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
21170 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
21180 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21190 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
211a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
211b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
211c0 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
211d0 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
211e0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
211f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
21200 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
21210 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
21220 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
21230 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
21240 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
21250 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
21260 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
21270 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
21280 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
21290 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
212a0 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
212b0 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
212c0 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
212d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
212e0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
212f0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
21300 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
21310 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
21320 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
21330 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
21340 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21350 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
21360 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
21370 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
21380 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
21390 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
213a0 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
213b0 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
213c0 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
213d0 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
213e0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
213f0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
21400 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
21410 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
21420 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
21430 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
21440 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
21450 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
21460 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
21470 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
21480 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
21490 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
214a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
214b0 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
214c0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
214d0 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
214e0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
214f0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
21500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21510 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21520 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
21530 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
21540 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
21550 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
21560 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
21570 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21580 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21590 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
215a0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
215b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
215c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
215d0 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
215e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
215f0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
21600 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
21610 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21620 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
21630 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
21640 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
21650 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
21660 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
21670 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
21680 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
21690 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
216a0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
216b0 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
216c0 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
216d0 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
216e0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
216f0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21700 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
21710 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21720 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
21730 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
21740 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21760 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21770 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
21780 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21790 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
217a0 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
217b0 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
217c0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
217d0 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
217e0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
217f0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21800 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
21810 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
21820 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21830 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21840 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21850 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21860 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21870 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21880 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
21890 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
218a0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
218b0 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
218c0 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
218d0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
218e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
218f0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
21900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21910 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21920 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21930 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
21940 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21950 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21970 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21980 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
21990 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
219a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
219b0 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
219c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
219d0 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
219e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
219f0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21a00 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21a10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21a20 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21a30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21a40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21a50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21a70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21a80 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
21a90 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
21aa0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
21ab0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
21ac0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
21ad0 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
21ae0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21af0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21b00 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21b10 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21b20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21b30 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21b40 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21b50 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21b60 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21b70 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21b80 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21b90 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
21ba0 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
21bb0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21bc0 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
21bd0 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
21be0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
21bf0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
21c00 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
21c10 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
21c20 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
21c30 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
21c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21c50 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21c60 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21c70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21c80 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
21c90 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21ca0 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
21cb0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
21cc0 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
21cd0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21ce0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21cf0 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
21d00 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
21d10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21d20 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21d30 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
21d40 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21d50 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21d60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21d80 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
21d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21db0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21dc0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
21dd0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
21de0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
21df0 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
21e00 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
21e10 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
21e20 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
21e30 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
21e40 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
21e50 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
21e60 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
21e70 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
21e80 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
21e90 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
21ea0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
21eb0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
21ec0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
21ed0 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
21ee0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
21ef0 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
21f00 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
21f10 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
21f20 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
21f30 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
21f40 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
21f50 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
21f60 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
21f70 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
21f80 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
21f90 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
21fa0 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
21fb0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
21fc0 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
21fd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
21fe0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
21ff0 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
22000 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22010 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
22020 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
22030 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
22040 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
22050 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
22060 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
22070 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
22080 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
22090 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
220a0 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
220b0 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  sz>0);.    sqlit
220c0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
220d0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
220e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
220f0 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20  P_SIZE, &sz);.  
22100 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
22110 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
22120 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79  imum size of any
22130 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
22140 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  made of the data
22150 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  base file..*/.vo
22160 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22170 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65  etMmapLimit(Page
22180 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74  r *pPager, sqlit
22190 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
221a0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d  {.  pPager->szMm
221b0 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70  ap = szMmap;.  p
221c0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
221d0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
221e0 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * Free as much m
221f0 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
22200 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
22210 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22220 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67  3PagerShrink(Pag
22230 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
22240 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69  qlite3PcacheShri
22250 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nk(pPager->pPCac
22260 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  he);.}../*.** Ad
22270 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66  just settings of
22280 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68   the pager to th
22290 6f 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  ose specified in
222a0 20 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72   the pgFlags par
222b0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
222c0 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46  e "level" in pgF
222d0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e  lags & PAGER_SYN
222e0 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65  CHRONOUS_MASK se
222f0 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  ts the robustnes
22300 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  s.** of the data
22310 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
22320 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
22330 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
22340 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e  es by.** changin
22350 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
22360 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
22370 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
22380 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  ls..** There are
22390 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
223a0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
223b0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
223c0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
223d0 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
223e0 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
223f0 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
22400 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
22410 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
22420 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
22430 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
22440 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
22450 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
22460 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22470 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
22480 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
22490 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
224a0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
224b0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
224c0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
224d0 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
224e0 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
22500 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
22510 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
22520 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
22530 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
22540 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
22550 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
22560 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
22570 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
22580 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
22590 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
225a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
225b0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
225c0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
225d0 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
225e0 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
225f0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22600 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
22610 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
22620 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
22630 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
22640 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
22650 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
22660 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
22670 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
22680 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22690 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
226a0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
226b0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
226c0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
226d0 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
226e0 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
226f0 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
22700 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
22710 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
22720 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
22730 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
22740 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
22750 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
22760 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
22770 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
22780 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
22790 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
227a0 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a  for a rollback-j
227b0 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f  ournal mode.  Fo
227c0 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20  r WAL mode, OFF 
227d0 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20  continues.** to 
227e0 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e  mean that no syn
227f0 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20  cs ever occur.  
22800 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61  NORMAL means tha
22810 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e  t the WAL is syn
22820 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ced.** prior to 
22830 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65  the start of che
22840 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74  ckpoint and that
22850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22860 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  le is synced.** 
22870 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
22880 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  n of the checkpo
22890 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72  int if the entir
228a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
228b0 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74   WAL.** was writ
228c0 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
228d0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  e database.  But
228e0 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69   no sync operati
228f0 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a  ons occur for.**
22900 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d   an ordinary com
22910 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f  mit in NORMAL mo
22920 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55  de with WAL.  FU
22930 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
22940 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73  e WAL.** file is
22950 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
22960 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70  g each commit op
22970 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69  eration, in addi
22980 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73  tion to the.** s
22990 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20  yncs associated 
229a0 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a  with NORMAL..**.
229b0 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73  ** Do not confus
229c0 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  e synchronous=FU
229d0 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53  LL with SQLITE_S
229e0 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a  YNC_FULL.  The.*
229f0 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  * SQLITE_SYNC_FU
22a00 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74  LL macro means t
22a10 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58  o use the MacOSX
22a20 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e  -style full-fsyn
22a30 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c  c.** using fcntl
22a40 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20  (F_FULLFSYNC).  
22a50 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22a60 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61  AL means to do a
22a70 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73  n.** ordinary fs
22a80 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65  ync() call.  The
22a90 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
22aa0 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49  nce between SQLI
22ab0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20  TE_SYNC_FULL.** 
22ac0 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  and SQLITE_SYNC_
22ad0 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f  NORMAL on platfo
22ae0 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  rms other than M
22af0 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a  acOSX.  But the.
22b00 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ** synchronous=F
22b10 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68  ULL versus synch
22b20 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65  ronous=NORMAL se
22b30 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73  tting determines
22b40 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79   when.** the xSy
22b50 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20  nc primitive is 
22b60 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65  called and is re
22b70 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c  levant to all pl
22b80 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e  atforms..**.** N
22b90 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
22ba0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22bb0 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
22bc0 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
22bd0 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
22be0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
22bf0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
22c00 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
22c10 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a  3PagerSetFlags(.
22c20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22c40 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
22c50 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
22c60 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
22c70 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  gs      /* Vario
22c80 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  us flags */.){. 
22c90 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20   unsigned level 
22ca0 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  = pgFlags & PAGE
22cb0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
22cc0 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  SK;.  if( pPager
22cd0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
22ce0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
22cf0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
22d00 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  ->fullSync = 0;.
22d10 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
22d20 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  aSync = 0;.  }el
22d30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22d40 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
22d50 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
22d60 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20  US_OFF ?1:0;.   
22d70 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
22d80 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52  c = level>=PAGER
22d90 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c  _SYNCHRONOUS_FUL
22da0 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  L ?1:0;.    pPag
22db0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
22dc0 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
22dd0 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f  CHRONOUS_EXTRA ?
22de0 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1:0;.  }.  if( p
22df0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22e00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22e10 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
22e20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22e30 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
22e40 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
22e50 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43   PAGER_FULLFSYNC
22e60 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22e70 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22e80 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22e90 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22ea0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22eb0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
22ec0 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
22ed0 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
22ee0 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22ef0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22f00 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22f10 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22f20 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22f30 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22f40 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
22f50 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22f60 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22f70 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22f80 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22f90 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22fa0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
22fb0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
22fc0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
22fd0 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
22fe0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22ff0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
23000 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
23010 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
23020 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IONS;.  }.  if( 
23030 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23040 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
23050 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23060 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
23070 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
23080 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23090 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
230a0 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
230b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
230c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
230d0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
230e0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
230f0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
23100 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
23110 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
23120 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
23130 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
23140 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
23150 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23160 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
23170 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
23180 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23190 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
231a0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
231b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
231c0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
231d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
231e0 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
231f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23200 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
23210 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
23220 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
23230 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
23240 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
23250 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
23260 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
23270 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
23280 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
23290 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
232a0 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
232b0 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
232c0 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
232d0 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
232e0 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
232f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23300 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23310 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
23320 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23330 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23340 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
23350 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23360 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
23370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23380 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
23390 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
233a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
233b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
233c0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
233d0 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
233e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
233f0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
23400 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
23410 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23420 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
23430 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
23440 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23450 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23460 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23470 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
23480 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
23490 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
234a0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
234b0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
234c0 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
234d0 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
234e0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
234f0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
23500 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
23510 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23520 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
23530 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
23540 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23550 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
23560 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
23570 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
23580 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
23590 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
235a0 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
235b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
235c0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
235d0 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
235e0 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
235f0 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
23600 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
23610 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
23620 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
23630 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
23640 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
23650 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
23660 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
23670 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
23680 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
23690 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
236a0 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
236b0 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
236c0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
236d0 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
236e0 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
236f0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
23700 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
23710 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
23720 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
23730 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
23740 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
23750 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
23760 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
23770 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
237a0 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
237b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
237e0 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
237f0 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
23800 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
23810 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
23820 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
23830 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
23840 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23850 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
23860 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
23870 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
23880 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
23890 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
238a0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
238b0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
238c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
238d0 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
238e0 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
238f0 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
23900 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
23910 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
23920 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
23930 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
23940 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
23950 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
23960 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
23970 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
239a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
239b0 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
239c0 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
239d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
239e0 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
239f0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
23a00 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a20 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
23a30 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
23a40 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  er */.){.  pPage
23a50 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
23a60 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
23a70 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
23a80 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
23a90 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20  yHandlerArg;..  
23aa0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
23ab0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  r->fd) ){.    vo
23ac0 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20  id **ap = (void 
23ad0 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73  **)&pPager->xBus
23ae0 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73  yHandler;.    as
23af0 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76  sert( ((int(*)(v
23b00 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d  oid *))(ap[0]))=
23b10 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b  =xBusyHandler );
23b20 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 5b  .    assert( ap[
23b30 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72  1]==pBusyHandler
23b40 41 72 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  Arg );.    sqlit
23b50 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
23b60 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  int(pPager->fd, 
23b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53  SQLITE_FCNTL_BUS
23b80 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20  YHANDLER, (void 
23b90 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  *)ap);.  }.}../*
23ba0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
23bb0 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
23bc0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
23bd0 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
23be0 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
23bf0 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
23c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
23c10 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
23c20 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
23c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23c40 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
23c50 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
23c60 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
23c70 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
23c80 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
23c90 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
23ca0 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
23cb0 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
23cc0 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
23cd0 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
23ce0 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
23cf0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
23d00 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
23d10 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
23d20 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
23d30 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
23d40 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
23d50 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
23d60 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
23d70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
23d80 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
23d90 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
23da0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
23db0 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23dc0 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
23dd0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
23de0 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
23df0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
23e00 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
23e10 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
23e20 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
23e30 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
23e40 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
23e50 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
23e60 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
23e70 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
23e80 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
23e90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
23ea0 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
23eb0 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
23ec0 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
23ed0 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
23ee0 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
23ef0 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
23f00 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
23f10 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
23f20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
23f30 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
23f40 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23f50 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
23f60 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
23f70 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
23f80 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
23f90 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23fa0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23fb0 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
23fc0 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
23fd0 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
23fe0 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
23ff0 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
24000 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
24010 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
24020 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
24030 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
24040 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
24050 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
24060 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
24070 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
24080 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
24090 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
240a0 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
240b0 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
240c0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
240d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
240e0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
240f0 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
24100 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
24110 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
24120 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
24130 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
24140 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
24150 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
24160 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
24170 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
24180 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
24190 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
241a0 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
241b0 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
241c0 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
241d0 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
241e0 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
241f0 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
24200 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
24210 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
24220 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
24230 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
24240 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
24250 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
24260 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
24270 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
24280 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
24290 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
242a0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
242b0 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
242c0 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
242d0 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
242e0 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
242f0 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
24300 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
24310 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
24320 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
24330 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
24340 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
24350 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
24360 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
24370 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
24380 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
24390 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
243a0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
243b0 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
243c0 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
243d0 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
243e0 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
243f0 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
24400 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
24410 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
24420 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
24430 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
24440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
24450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
24460 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
24470 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
24480 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
24490 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
244a0 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
244b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
244c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
244d0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
244e0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
244f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
24500 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
24510 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
24520 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
24530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24540 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
24550 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
24560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24570 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
24580 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
24590 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
245a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
245b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
245c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
245d0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
245e0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
245f0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
24600 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
24610 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
24620 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
24630 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
24640 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
24650 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
24660 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  geSize;.    }els
24670 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
24680 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  PageFree(pNew);.
24690 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
246a0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
246b0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
246c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
246d0 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
246e0 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
246f0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
24700 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
24710 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
24720 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
24730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
24740 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
24750 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
24760 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
24770 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
24780 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
24790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
247a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
247b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
247c0 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
247d0 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
247e0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
247f0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
24800 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
24810 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
24820 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
24830 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
24840 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
24850 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
24860 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
24870 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
24880 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
24890 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
248a0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
248b0 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
248c0 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
248d0 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
248e0 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
248f0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
24900 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
24910 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
24920 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
24930 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24940 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
24950 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
24960 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
24970 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
24980 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
24990 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
249a0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
249b0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
249c0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
249d0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
249e0 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
249f0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
24a00 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
24a10 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
24a20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
24a30 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
24a40 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
24a50 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
24a60 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
24a70 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
24a80 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
24a90 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
24aa0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
24ab0 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
24ac0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
24ad0 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
24ae0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24af0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24b00 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
24b10 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
24b20 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
24b30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24b40 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
24b50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
24b60 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
24b70 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
24b80 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24b90 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
24ba0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24bb0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
24bc0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
24bd0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
24be0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
24bf0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
24c00 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
24c10 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
24c20 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
24c30 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
24c40 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24c50 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
24c60 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
24c70 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
24c80 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
24c90 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
24ca0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
24cb0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
24cc0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24cd0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24ce0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24cf0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
24d00 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24d10 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
24d20 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
24d30 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
24d40 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24d50 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
24d60 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
24d70 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
24d80 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24d90 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
24da0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
24db0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24dc0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
24dd0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24de0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
24df0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24e00 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24e10 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
24e20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
24e30 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24e40 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
24e50 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
24e60 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
24e70 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
24e80 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
24e90 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
24ea0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
24eb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
24ec0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
24ed0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
24ee0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
24ef0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
24f00 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
24f10 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
24f20 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
24f30 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
24f40 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
24f50 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
24f60 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
24f70 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
24f80 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
24f90 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
24fa0 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
24fb0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
24fc0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
24fd0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
24fe0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
24ff0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
25000 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
25010 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
25020 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
25030 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25040 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
25050 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
25060 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25070 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
25080 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
25090 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
250a0 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
250b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
250c0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
250d0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
250e0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
250f0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
25100 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25110 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
25120 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
25130 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
25140 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
25150 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25160 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
25170 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
25180 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
25190 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
251a0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
251b0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
251c0 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
251d0 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
251e0 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
251f0 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
25200 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
25210 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
25220 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
25230 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
25240 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
25250 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
25260 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
25270 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
25280 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
25290 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
252a0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
252b0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
252c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
252d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
252e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
252f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25300 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
25310 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
25320 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
25330 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
25340 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
25350 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
25360 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
25370 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
25380 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
25390 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
253a0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
253b0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
253c0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
253d0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
253e0 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
253f0 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
25400 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25410 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
25420 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
25430 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
25440 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25450 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
25460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25470 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
25480 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
25490 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
254a0 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
254b0 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
254c0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
254d0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
254e0 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
254f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
25500 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
25510 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
25520 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
25530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25540 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
25550 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
25560 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
25570 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
25580 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
25590 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
255a0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
255b0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
255c0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
255d0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
255e0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
255f0 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
25600 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
25610 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
25620 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
25630 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
25640 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
25650 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
25660 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
25670 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
25680 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
25690 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
256a0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
256b0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
256c0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
256d0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
256e0 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
256f0 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
25700 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
25710 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
25720 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
25730 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
25740 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
25750 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25780 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
25790 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
257a0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
257b0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
257c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
257d0 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
257e0 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e  ady held), or on
257f0 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  e of the transit
25800 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
25810 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
25820 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
25830 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
25840 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
25850 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
25860 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
25870 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
25880 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
25890 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
258a0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
258b0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
258c0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
258d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
258e0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
258f0 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
25900 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25910 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
25920 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
25930 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
25940 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
25950 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
25960 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
25970 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
25980 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
25990 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
259a0 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
259b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
259c0 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
259d0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
259e0 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
259f0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
25a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
25a10 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
25a20 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
25a30 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
25a40 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
25a50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
25a60 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
25a70 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
25a80 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
25a90 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
25aa0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
25ab0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
25ac0 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
25ad0 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
25ae0 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
25af0 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
25b00 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
25b10 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
25b20 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
25b30 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
25b40 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
25b50 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
25b60 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
25b70 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
25b80 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
25b90 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
25ba0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
25bb0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
25bc0 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
25bd0 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
25be0 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
25bf0 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
25c00 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
25c10 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
25c20 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
25c30 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
25c40 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
25c50 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
25c60 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
25c70 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
25c80 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
25c90 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
25ca0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
25cb0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
25cc0 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
25cd0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
25ce0 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
25cf0 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
25d00 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
25d10 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
25d20 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
25d30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
25d40 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
25d50 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
25d60 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
25d70 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
25d80 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
25d90 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
25da0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
25db0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
25dc0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
25dd0 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
25de0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
25df0 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
25e00 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
25e10 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
25e20 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25e30 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
25e40 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25e50 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25e60 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
25e70 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
25e80 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
25e90 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
25ea0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
25eb0 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
25ec0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
25ed0 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
25ee0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25ef0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25f00 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25f10 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25f20 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
25f30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25f40 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25f50 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
25f60 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
25f70 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25f80 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
25f90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
25fa0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
25fb0 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
25fc0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
25fd0 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
25fe0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
25ff0 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
26000 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
26010 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
26020 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
26030 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
26040 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
26050 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
26060 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
26070 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
26080 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
26090 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
260a0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
260b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
260c0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
260d0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
260e0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
260f0 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
26100 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
26110 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
26120 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
26130 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
26140 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
26150 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
26160 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
26170 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
26180 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
26190 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
261a0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
261b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
261c0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
261d0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
261e0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
261f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
26200 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
26210 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
26220 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
26230 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
26240 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
26250 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
26260 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
26270 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
26280 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26290 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
262a0 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
262b0 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
262c0 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
262d0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
262e0 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
262f0 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
26300 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
26310 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
26320 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
26330 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
26340 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
26350 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
26360 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
26370 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
26380 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
26390 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
263a0 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
263b0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
263c0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
263d0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
263e0 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
263f0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
26400 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
26410 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
26420 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
26430 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
26440 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
26450 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
26460 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
26470 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
26480 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
26490 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
264a0 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
264b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
264c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
264d0 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
264e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
264f0 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
26500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
26510 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
26520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
26530 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
26540 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
26550 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
26560 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
26570 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
26580 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
26590 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
265a0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
265b0 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
265c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
265d0 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
265e0 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
265f0 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
26600 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
26610 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
26620 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
26630 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
26640 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
26650 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
26660 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
26670 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
26680 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
26690 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
266a0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
266b0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
266c0 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
266d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
266e0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
266f0 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
26700 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
26710 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
26720 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
26730 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
26740 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
26750 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
26760 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
26770 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
26780 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
26790 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
267a0 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
267b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
267c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
267d0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
267e0 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
267f0 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
26800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26810 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
26820 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
26830 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26840 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
26850 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
26860 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
26870 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
26880 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
26890 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
268a0 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
268b0 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
268c0 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
268d0 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
268e0 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
268f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
26900 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
26910 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
26920 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
26930 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
26940 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
26950 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
26960 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
26970 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
26980 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
26990 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
269a0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
269b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
269c0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
269d0 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
269e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
269f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
26a00 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
26a10 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a30 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
26a40 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a60 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
26a70 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
26a80 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
26a90 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
26aa0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
26ab0 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
26ac0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
26ad0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26af0 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26b00 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
26b10 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e   .  if( pPager->
26b20 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26b30 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26b40 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26b50 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
26b60 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26b70 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
26b80 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
26b90 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
26ba0 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
26bb0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
26bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
26bd0 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
26be0 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
26bf0 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
26c00 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
26c10 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26c20 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26c30 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26c40 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
26c50 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
26c60 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
26c70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26c80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
26c90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
26ca0 45 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29  Extra = (void *)
26cb0 26 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c  &p[1];.    p->fl
26cc0 61 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50  ags = PGHDR_MMAP
26cd0 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20  ;.    p->nRef = 
26ce0 31 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72  1;.    p->pPager
26cf0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a   = pPager;.  }..
26d00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78    assert( p->pEx
26d10 74 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b  tra==(void *)&p[
26d20 31 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  1] );.  assert( 
26d30 70 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  p->pPage==0 );. 
26d40 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67   assert( p->flag
26d50 73 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b  s==PGHDR_MMAP );
26d60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26d70 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
26d80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
26d90 66 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67  f==1 );..  p->pg
26da0 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e  no = pgno;.  p->
26db0 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
26dc0 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
26dd0 74 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  t++;..  return S
26de0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
26df0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
26e00 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70  erence to page p
26e10 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76  Pg. pPg must hav
26e20 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20  e been returned 
26e30 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65  by an .** earlie
26e40 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41  r call to pagerA
26e50 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e  cquireMapPage().
26e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26e70 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
26e80 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
26e90 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26ea0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
26eb0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f    pPager->nMmapO
26ec0 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69  ut--;.  pPg->pDi
26ed0 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d  rty = pPager->pM
26ee0 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70  mapFreelist;.  p
26ef0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26f00 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61  list = pPg;..  a
26f10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
26f20 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
26f30 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71  rsion>=3 );.  sq
26f40 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
26f50 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
26f60 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50  (pPg->pgno-1)*pP
26f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
26f80 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a  pPg->pData);.}..
26f90 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50  /*.** Free all P
26fa0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f  gHdr objects sto
26fb0 72 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72  red in the Pager
26fc0 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c  .pMmapFreelist l
26fd0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
26fe0 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70  oid pagerFreeMap
26ff0 48 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67  Hdrs(Pager *pPag
27000 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  er){.  PgHdr *p;
27010 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b  .  PgHdr *pNext;
27020 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d  .  for(p=pPager-
27030 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20  >pMmapFreelist; 
27040 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20  p; p=pNext){.   
27050 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72   pNext = p->pDir
27060 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ty;.    sqlite3_
27070 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(p);.  }.}..
27080 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
27090 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
270a0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
270b0 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
270c0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
270d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
270e0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
270f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
27100 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
27110 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
27120 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
27130 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
27140 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
27150 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
27160 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
27170 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
27180 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
27190 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
271a0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
271b0 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
271c0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
271d0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
271e0 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
271f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
27200 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
27210 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
27220 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
27230 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
27240 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
27250 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
27260 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
27270 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
27280 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
27290 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
272a0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
272b0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
272c0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
272d0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
272e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
272f0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
27300 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  r){.  u8 *pTmp =
27310 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
27320 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73  TmpSpace;..  ass
27330 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27340 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27350 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  );.  disable_sim
27360 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
27370 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
27380 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
27390 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61 70  ;.  pagerFreeMap
273a0 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20  Hdrs(pPager);.  
273b0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  /* pPager->errCo
273c0 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  de = 0; */.  pPa
273d0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
273e0 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  de = 0;.#ifndef 
273f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
27400 20 20 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73    sqlite3WalClos
27410 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
27420 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
27430 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27440 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a  ageSize, pTmp);.
27450 20 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d    pPager->pWal =
27460 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67   0;.#endif.  pag
27470 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
27480 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
27490 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
274a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
274b0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
274c0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
274d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
274e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
274f0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27500 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
27510 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
27520 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
27530 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
27540 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
27550 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
27560 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
27570 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
27580 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
27590 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
275a0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
275b0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
275c0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
275d0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
275e0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
275f0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
27600 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
27610 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
27620 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
27630 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
27640 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
27650 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
27660 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
27670 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
27680 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
27690 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
276a0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
276b0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
276c0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
276d0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
276e0 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
276f0 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
27700 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
27710 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
27720 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
27730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27740 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
27750 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
27760 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
27770 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
27780 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
27790 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
277a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
277b0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
277c0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
277d0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
277e0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
277f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
27800 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
27810 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
27820 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27830 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
27840 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
27850 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
27860 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
27870 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
27880 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
27890 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
278a0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
278b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
278c0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
278d0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
278e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
278f0 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
27900 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
27910 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
27920 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
27930 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
27940 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
27950 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
27960 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
27970 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
27980 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27990 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
279a0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
279b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
279c0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
279d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
279e0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
279f0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
27a00 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
27a10 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
27a20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
27a30 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
27a40 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
27a50 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
27a60 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
27a70 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
27a80 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
27a90 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
27aa0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
27ab0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
27ac0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
27ad0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
27ae0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
27af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
27b00 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
27b10 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
27b20 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
27b30 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
27b40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
27b50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
27b60 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
27b70 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
27b80 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
27b90 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
27ba0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
27bb0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
27bc0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
27bd0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
27be0 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
27bf0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
27c00 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
27c10 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
27c20 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
27c30 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
27c40 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
27c50 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
27c60 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
27c70 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
27c80 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
27c90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
27ca0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27cb0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
27cc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
27cd0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
27ce0 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
27cf0 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
27d00 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
27d10 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27d20 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
27d30 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
27d40 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
27d50 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
27d60 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
27d70 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
27d80 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
27d90 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
27da0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
27db0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
27dc0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
27dd0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
27de0 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
27df0 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
27e00 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
27e10 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
27e20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27e30 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
27e40 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
27e50 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
27e60 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
27e70 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
27e80 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
27e90 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
27ea0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
27eb0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27ec0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
27ed0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
27ee0 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
27ef0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
27f00 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
27f10 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
27f20 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
27f30 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
27f40 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
27f50 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
27f60 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
27f70 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
27f80 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
27f90 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
27fa0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27fb0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
27fc0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
27fd0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
27fe0 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
27ff0 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
28000 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
28010 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
28020 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
28030 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
28040 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
28050 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
28060 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
28070 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28080 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
28090 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
280a0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
280b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
280c0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
280d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
28100 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28110 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28120 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
28130 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
28140 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
28150 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
28160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
28170 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
28180 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
28190 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
281a0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
281b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
281c0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
281d0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
281e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
281f0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
28200 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
28210 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
28220 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28230 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
28240 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28250 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28260 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28270 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28280 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
28290 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
282a0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
282b0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
282c0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
282d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
282e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
282f0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
28300 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
28310 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
28320 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
28330 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
28340 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
28350 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
28360 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
28370 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
28380 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
28390 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
283a0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
283b0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
283c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
283d0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
283e0 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
283f0 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
28400 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
28410 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
28420 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
28430 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
28440 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
28450 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
28460 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
28470 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
28480 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
28490 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
284a0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
284b0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
284c0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
284d0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
284e0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
284f0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
28500 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
28510 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
28520 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
28530 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
28540 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28550 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
28560 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
28570 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
28580 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
28590 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
285a0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
285b0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
285c0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
285d0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
285e0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
285f0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
28600 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
28610 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
28620 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
28630 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
28640 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
28650 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
28660 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
28670 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
28680 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
28690 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
286a0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
286b0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
286c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
286d0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
286e0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
286f0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
28700 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
28710 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
28720 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
28730 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
28740 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
28750 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
28760 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
28770 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
28780 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
28790 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
287a0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
287b0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
287c0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
287d0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
287e0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
287f0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
28800 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
28810 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
28820 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
28830 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
28840 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
28850 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
28860 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
28870 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
28880 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28890 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
288a0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
288b0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
288c0 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
288d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
288e0 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
288f0 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
28900 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28910 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
28920 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
28930 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
28940 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
28950 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
28960 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
28970 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
28980 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
28990 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
289a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
289b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
289c0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
289d0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
289e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
289f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28a00 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
28a10 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
28a20 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
28a30 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
28a40 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
28a50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28a60 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
28a70 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
28a80 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
28a90 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28aa0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
28ab0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
28ac0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
28ad0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
28ae0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28af0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
28b00 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28b10 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
28b20 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
28b30 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
28b40 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
28b50 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
28b60 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
28b70 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
28b80 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
28b90 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
28ba0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
28bb0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
28bc0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
28bd0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
28be0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
28bf0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
28c00 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
28c10 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
28c20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
28c30 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
28c40 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
28c50 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28c60 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
28c70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
28c80 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
28c90 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
28ca0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
28cb0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
28cc0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
28cd0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
28ce0 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
28cf0 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
28d00 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
28d10 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
28d20 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
28d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
28d40 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
28d50 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
28d60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28d70 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
28d80 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
28d90 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
28da0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
28db0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28dc0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28dd0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28de0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28df0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28e00 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28e10 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
28e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28e30 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28e40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28e50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
28e90 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
28ea0 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
28eb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28ec0 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
28ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28ee0 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
28ef0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
28f00 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
28f10 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
28f20 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
28f30 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28f60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
28f70 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28f80 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
28f90 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
28fa0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
28fb0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
28fc0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
28fd0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28fe0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28ff0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
29000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
29010 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
29020 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
29030 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
29040 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
29050 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
29060 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
29070 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
29080 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
29090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
290a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
290b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
290c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
290d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
290e0 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
290f0 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
29100 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
29110 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
29120 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
29130 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
29140 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
29150 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
29160 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29170 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29180 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
29190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
291a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
291b0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
291c0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
291d0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
291e0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
291f0 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
29200 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
29210 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
29220 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
29230 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
29240 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
29250 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
29260 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
29270 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
29280 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
29290 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
292a0 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
292b0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
292c0 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
292d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
292e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
292f0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
29300 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
29310 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
29320 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
29330 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
29340 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
29350 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
29360 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
29370 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
29380 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
29390 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
293a0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
293b0 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
293c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
293d0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
293e0 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
293f0 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
29400 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
29410 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
29420 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
29430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
29440 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
29450 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
29460 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
29470 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
29480 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
29490 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
294a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
294b0 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
294c0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
294d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
294e0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
294f0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
29500 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
29510 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
29520 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
29530 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
29540 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
29550 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
29560 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
29570 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
29580 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
29590 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
295a0 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
295b0 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
295c0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
295d0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
295e0 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
295f0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
29600 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
29610 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
29620 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
29630 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
29640 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29650 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29660 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
29670 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
29680 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
29690 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
296a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
296b0 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
296c0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
296d0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
296e0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
296f0 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
29700 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
29710 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
29720 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
29730 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
29740 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
29750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29760 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
29770 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
29780 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
29790 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
297a0 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
297b0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
297c0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
297d0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
297e0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
297f0 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
29800 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
29810 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
29820 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
29830 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
29840 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
29850 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
29860 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
29870 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
29880 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
29890 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
298a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
298b0 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
298c0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
298d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
298e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
298f0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
29900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
29910 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
29920 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29930 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
29940 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29950 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
29960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
29970 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
29980 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
29990 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
299a0 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
299b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
299c0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
299d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
299e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
299f0 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
29a00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
29a10 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
29a20 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
29a30 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
29a40 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
29a50 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
29a60 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
29a70 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
29a80 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
29a90 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
29aa0 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
29ab0 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
29ac0 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
29ad0 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
29ae0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
29af0 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
29b00 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
29b10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
29b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
29b30 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
29b40 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
29b50 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
29b60 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
29b70 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
29b80 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Flags);.  }..  /
29b90 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72  * Before the fir
29ba0 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74  st write, give t
29bb0 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66  he VFS a hint of
29bc0 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a   what the final.
29bd0 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77    ** file size w
29be0 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61  ill be..  */.  a
29bf0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
29c00 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
29c10 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
29c20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29c30 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  K .   && pPager-
29c40 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67  >dbHintSize<pPag
29c50 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26  er->dbSize.   &&
29c60 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20   (pList->pDirty 
29c70 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70  || pList->pgno>p
29c80 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
29c90 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  e).  ){.    sqli
29ca0 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65  te3_int64 szFile
29cb0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
29cc0 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69  ize * (sqlite3_i
29cd0 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53  nt64)pPager->dbS
29ce0 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ize;.    sqlite3
29cf0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
29d00 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
29d10 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
29d20 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a  HINT, &szFile);.
29d30 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69      pPager->dbHi
29d40 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ntSize = pPager-
29d50 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  >dbSize;.  }..  
29d60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29d70 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
29d80 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
29d90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20   pList->pgno;.. 
29da0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
29db0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
29dc0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
29dd0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
29de0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
29df0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
29e00 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
29e10 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
29e20 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20  cateImage() was 
29e30 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
29e40 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
29e50 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
29e60 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
29e70 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
29e80 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
29e90 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
29ea0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
29eb0 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20      ** Also, do 
29ec0 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e  not write out an
29ed0 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
29ee0 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57  the PGHDR_DONT_W
29ef0 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a  RITE flag.    **
29f00 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c   set (set by sql
29f10 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
29f20 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  te())..    */.  
29f30 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
29f40 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d  er->dbSize && 0=
29f50 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50  =(pList->flags&P
29f60 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29  GHDR_DONT_WRITE)
29f70 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66   ){.      i64 of
29f80 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
29f90 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
29fa0 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73  eSize;   /* Offs
29fb0 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  et to write */. 
29fc0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
29fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77      /* Data to w
2a000 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20  rite */    ..   
2a010 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73     assert( (pLis
2a020 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  t->flags&PGHDR_N
2a030 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2a040 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
2a050 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
2a060 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
2a070 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20  nter(pList);..  
2a080 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
2a090 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2a0a0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2a0b0 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
2a0c0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
2a0d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2a0e0 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20  PT, pData);..   
2a0f0 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20     /* Write out 
2a100 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a  the page data. *
2a110 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2a120 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
2a130 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
2a140 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
2a150 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20   offset);..     
2a160 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61   /* If page 1 wa
2a170 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  s just written, 
2a180 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46  update Pager.dbF
2a190 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68  ileVers to match
2a1a0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61  .      ** the va
2a1b0 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69  lue now stored i
2a1c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a1d0 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20  ile. If writing 
2a1e0 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  this .      ** p
2a1f0 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64  age caused the d
2a200 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2a210 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46  grow, update dbF
2a220 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20  ileSize. .      
2a230 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  */.      if( pgn
2a240 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  o==1 ){.        
2a250 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2a260 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61  dbFileVers, &pDa
2a270 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70  ta[24], sizeof(p
2a280 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2a290 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  s));.      }.   
2a2a0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
2a2b0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2a2c0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
2a2d0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
2a2e0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gno;.      }.   
2a2f0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
2a300 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54  [PAGER_STAT_WRIT
2a310 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  E]++;..      /* 
2a320 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75  Update any backu
2a330 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e  p objects copyin
2a340 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a350 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f  f this pager. */
2a360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
2a370 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
2a380 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
2a390 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44  , (u8*)pList->pD
2a3a0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  ata);..      PAG
2a3b0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
2a3c0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
2a3d0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
2a3f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
2a400 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
2a410 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
2a420 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
2a430 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
2a440 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
2a450 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
2a460 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2a470 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
2a480 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47  }else{.      PAG
2a490 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52  ERTRACE(("NOSTOR
2a4a0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
2a4b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a4c0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a  , pgno));.    }.
2a4d0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
2a4e0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20  gehash(pList);. 
2a4f0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
2a500 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
2a510 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a520 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74  *.** Ensure that
2a530 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a540 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49   file is open. I
2a550 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2a560 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66  open, this .** f
2a570 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2a580 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
2a590 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2a5a0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
2a5b0 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
2a5c0 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c  plan. An .** SQL
2a5d0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
2a5e0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2a5f0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
2a600 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  o sqlite3OsOpen(
2a610 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a  ) .** fails..*/.
2a620 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
2a630 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
2a640 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2a650 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a660 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2a670 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
2a680 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2a690 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2a6a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2a6b0 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2a6c0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2a6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
2a6e0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
2a6f0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
2a700 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2a710 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
2a720 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2a730 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
2a740 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
2a750 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2a760 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
2a770 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
2a780 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
2a790 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
2a7a0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2a7b0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  l. .**.** If suc
2a7c0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
2a7d0 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
2a7e0 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
2a7f0 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
2a800 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
2a810 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
2a820 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
2a830 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2a840 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
2a850 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
2a860 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
2a870 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
2a880 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
2a890 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
2a8a0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
2a8b0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
2a8c0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
2a8d0 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
2a8e0 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
2a8f0 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
2a900 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
2a910 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2a920 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
2a930 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
2a950 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a960 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
2a970 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2a980 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
2a990 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
2a9a0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
2a9b0 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
2a9c0 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
2a9d0 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
2a9e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a9f0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2aa00 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2aa10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2aa20 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
2aa30 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
2aa40 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2aa50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
2aa60 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
2aa70 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2aa80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2aa90 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
2aaa0 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
2aab0 70 50 61 67 65 72 2c 20 70 50 67 29 20 0a 20 20  pPager, pPg) .  
2aac0 20 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70         || pPg->p
2aad0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
2aae0 69 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20  igSize .    );. 
2aaf0 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a     rc = openSubJ
2ab00 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2ab10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
2ab20 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f  ub-journal was o
2ab30 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  pened successful
2ab40 6c 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61  ly (or was alrea
2ab50 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a  dy open),.    **
2ab60 20 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e   write the journ
2ab70 61 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  al record into t
2ab80 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20  he file.  */.   
2ab90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2aba0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  OK ){.      void
2abb0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
2abc0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20  Data;.      i64 
2abd0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 50  offset = (i64)pP
2abe0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34  ager->nSubRec*(4
2abf0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
2ac00 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  e);.      char *
2ac10 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20 20 20  pData2;.  .     
2ac20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
2ac30 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
2ac40 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
2ac50 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
2ac60 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
2ac70 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2ac80 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2ac90 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2aca0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2acb0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2acc0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2acd0 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2ace0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2acf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ad00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ad10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2ad20 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2ad30 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2ad40 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2ad50 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2ad60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2ad70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ad80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2ad90 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2ada0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2adb0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2adc0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2add0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2ade0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2adf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ae00 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2ae10 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2ae20 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2ae30 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2ae40 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2ae50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2ae60 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2ae70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2ae80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ae90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2aea0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2aeb0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2aec0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2aed0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2aee0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2aef0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2af00 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2af10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2af20 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2af30 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2af40 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2af50 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2af60 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2af70 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2af80 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2af90 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2afa0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2afb0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2afc0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2afd0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2afe0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2aff0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2b000 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2b010 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2b020 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2b030 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2b040 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2b050 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2b060 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2b070 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2b080 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2b090 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2b0a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2b0b0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2b0c0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2b0d0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2b0e0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2b0f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2b100 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2b110 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2b120 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2b130 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2b140 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2b150 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2b160 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2b170 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2b180 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2b190 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2b1a0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2b1b0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2b1c0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2b1d0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2b1e0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2b1f0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2b200 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2b210 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2b220 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2b230 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2b240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2b250 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2b260 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2b270 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2b280 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2b290 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b2a0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2b2b0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2b2c0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2b2d0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2b2e0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2b2f0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2b300 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2b310 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2b320 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2b330 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2b340 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2b350 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2b360 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2b370 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2b380 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2b390 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2b3a0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2b3b0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2b3c0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2b3d0 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2b3e0 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2b3f0 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2b400 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2b410 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2b420 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2b430 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2b440 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2b450 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2b460 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2b470 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2b480 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2b490 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2b4a0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2b4b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2b4c0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2b4d0 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2b4e0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2b4f0 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2b500 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2b510 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2b520 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2b530 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2b540 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2b550 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2b560 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2b570 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2b580 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2b590 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2b5a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2b5b0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2b5c0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2b5d0 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2b5e0 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2b5f0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2b600 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2b610 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2b620 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2b630 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2b640 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2b650 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2b660 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2b670 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b680 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2b6a0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b6b0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b6c0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b6d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b6e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b6f0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2b700 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2b710 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b720 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b730 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2b740 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b750 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2b760 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b770 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2b780 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2b790 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2b7a0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2b7b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2b7c0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2b7d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b7e0 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2b7f0 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2b800 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b810 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2b820 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2b830 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2b840 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2b850 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2b860 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2b870 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2b880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b890 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2b8a0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2b8b0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2b8c0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2b8d0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2b8e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2b8f0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b900 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2b910 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2b920 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2b930 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2b940 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2b950 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2b960 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b970 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2b980 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2b990 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b9a0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2b9b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b9c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b9d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b9e0 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2b9f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2ba00 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2ba10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2ba20 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2ba30 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2ba40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2ba50 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2ba60 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2ba70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ba80 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2ba90 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2baa0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2bab0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2bac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2bad0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2bae0 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2baf0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2bb00 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2bb10 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2bb20 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2bb30 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2bb40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2bb50 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2bb60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2bb70 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2bb80 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2bb90 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2bba0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2bbb0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2bbc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2bbd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2bbe0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2bbf0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2bc00 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2bc10 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2bc20 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2bc30 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2bc40 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2bc50 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2bc60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2bc70 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2bc80 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2bc90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2bca0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2bcb0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2bcc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2bcd0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2bce0 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2bcf0 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2bd00 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2bd10 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2bd20 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2bd30 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2bd40 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2bd50 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2bd60 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2bd70 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2bd80 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2bd90 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2bda0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2bdb0 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2bdc0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2bdd0 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2bde0 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2bdf0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2be00 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2be10 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2be20 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2be30 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2be40 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2be50 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2be60 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2be70 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2be80 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2be90 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2bea0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2beb0 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2bec0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2bed0 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2bee0 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2bef0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2bf00 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2bf10 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2bf20 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2bf30 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2bf40 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2bf50 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2bf60 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2bf70 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2bf80 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2bf90 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2bfa0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2bfb0 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2bfc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
2bfd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
2bfe0 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
2bff0 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
2c000 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
2c010 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
2c020 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
2c030 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
2c040 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
2c050 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
2c060 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  * flags..**.** T
2c070 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
2c080 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
2c090 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
2c0a0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2c0b0 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
2c0c0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
2c0d0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
2c0e0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
2c0f0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
2c100 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
2c110 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
2c120 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2c130 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
2c140 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
2c150 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2c160 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
2c170 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
2c180 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
2c190 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
2c1a0 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
2c1b0 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
2c1c0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
2c1d0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
2c1e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2c1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c200 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
2c210 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
2c220 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
2c230 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
2c240 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
2c250 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
2c260 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
2c270 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2c280 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2c290 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
2c2a0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
2c2b0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
2c2c0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
2c2d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
2c2e0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
2c2f0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2c300 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2c310 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2c320 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
2c330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c340 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2c350 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
2c360 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2c370 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
2c380 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2c390 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
2c3a0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2c3b0 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
2c3c0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
2c3d0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
2c3e0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2c3f0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
2c400 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
2c410 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
2c420 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2c430 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
2c440 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
2c450 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
2c460 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
2c470 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2c480 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
2c490 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
2c4a0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
2c4b0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
2c4c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2c4d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2c4e0 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
2c4f0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
2c500 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
2c510 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
2c520 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
2c530 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
2c540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2c550 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2c560 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
2c570 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
2c580 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
2c590 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c5a0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
2c5b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
2c5c0 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
2c5d0 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2c5e0 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
2c5f0 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
2c600 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
2c610 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
2c620 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
2c630 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
2c640 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2c650 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c660 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
2c670 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
2c680 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
2c690 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
2c6a0 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
2c6b0 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
2c6c0 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  al */.  int pcac
2c6d0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
2c6e0 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
2c6f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c700 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
2c710 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
2c720 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2c730 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2c740 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
2c750 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63  page size */.  c
2c760 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20  onst char *zUri 
2c770 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61  = 0;    /* URI a
2c780 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  rgs to copy */. 
2c790 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20   int nUri = 0;  
2c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c7b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c7c0 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72  URI args at *zUr
2c7d0 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  i */..  /* Figur
2c7e0 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
2c7f0 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
2c800 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2c810 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
2c820 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
2c830 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
2c840 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
2c850 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
2c860 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46  .  */.  journalF
2c870 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2c880 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2c890 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f  ize(pVfs));..  /
2c8a0 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
2c8b0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
2c8c0 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
2c8d0 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
2c8e0 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23  *ppPager = 0;..#
2c8f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c900 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66  IT_MEMORYDB.  if
2c910 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ( flags & PAGER_
2c920 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65  MEMORY ){.    me
2c930 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mDb = 1;.    if(
2c940 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2c950 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2c960 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c970 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
2c980 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  0, zFilename);. 
2c990 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61       if( zPathna
2c9a0 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20  me==0  ) return 
2c9b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2c9c0 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61  T;.      nPathna
2c9d0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c9e0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2c9f0 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  .      zFilename
2ca00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2ca10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
2ca20 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
2ca30 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2ca40 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
2ca50 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
2ca60 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
2ca70 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
2ca80 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
2ca90 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
2caa0 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
2cab0 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
2cac0 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
2cad0 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
2cae0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2caf0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2cb00 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2cb10 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e  r *z;.    nPathn
2cb20 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
2cb30 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
2cb40 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2cb50 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
2cb60 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
2cb70 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2cb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2cb90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2cba0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2cbb0 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
2cbc0 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
2cbd0 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
2cbe0 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
2cbf0 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  ) fails */.    r
2cc00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  c = sqlite3OsFul
2cc10 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
2cc20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
2cc30 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29  name, zPathname)
2cc40 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2cc50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2cc60 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
2cc70 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46    z = zUri = &zF
2cc80 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53  ilename[sqlite3S
2cc90 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
2cca0 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
2ccb0 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20  ( *z ){.      z 
2ccc0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2ccd0 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a  30(z)+1;.      z
2cce0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2ccf0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a  n30(z)+1;.    }.
2cd00 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29      nUri = (int)
2cd10 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a  (&z[1] - zUri);.
2cd20 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69      assert( nUri
2cd30 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  >=0 );.    if( r
2cd40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2cd50 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
2cd60 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
2cd70 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2cd80 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
2cd90 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
2cda0 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
2cdb0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
2cdc0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
2cdd0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
2cde0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
2cdf0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
2ce00 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
2ce10 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
2ce20 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
2ce30 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
2ce40 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
2ce50 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
2ce60 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
2ce70 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
2ce80 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
2ce90 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
2cea0 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
2ceb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2cec0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
2ced0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
2cee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2cef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2cf00 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2cf10 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2cf20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cf30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c   }.  }..  /* All
2cf40 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
2cf50 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2cf60 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a  ture, PCache obj
2cf70 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68  ect, the.  ** th
2cf80 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ree file descrip
2cf90 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61  tors, the databa
2cfa0 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64  se file name and
2cfb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2cfc0 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68  ** file name. Th
2cfd0 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f  e layout in memo
2cfe0 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ry is as follows
2cff0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2d000 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20  Pager object    
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62  (sizeof(Pager) b
2d030 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50  ytes).  **     P
2d040 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20  Cache object    
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d060 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2d070 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e() bytes).  ** 
2d080 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2d090 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2d0a0 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46      (pVfs->szOsF
2d0b0 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ile bytes).  ** 
2d0c0 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20      Sub-journal 
2d0d0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d0e0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2d0f0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2d100 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61       Main journa
2d110 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
2d120 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d130 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d140 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
2d150 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
2d160 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d170 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  +1 bytes).  **  
2d180 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
2d190 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2d1a0 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b     (nPathname+8+
2d1b0 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20  1 bytes).  */.  
2d1c0 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c  pPtr = (u8 *)sql
2d1d0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
2d1e0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
2d1f0 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20  f(*pPager)) +   
2d200 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75     /* Pager stru
2d210 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55  cture */.    ROU
2d220 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20  ND8(pcacheSize) 
2d230 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  +           /* P
2d240 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Cache object */.
2d250 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d      ROUND8(pVfs-
2d260 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20  >szOsFile) +    
2d270 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
2d280 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
2d290 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
2d2a0 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2 +          /* 
2d2b0 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
2d2c0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50  files */ .    nP
2d2d0 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2d2e0 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20  ri +         /* 
2d2f0 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20  zFilename */.   
2d300 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b   nPathname + 8 +
2d310 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
2d320 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  /* zJournal */.#
2d330 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d340 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61  IT_WAL.    + nPa
2d350 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20  thname + 4 + 2  
2d360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61            /* zWa
2d370 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b  l */.#endif.  );
2d380 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2d390 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2d3a0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2d3b0 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  R(journalFileSiz
2d3c0 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50  e)) );.  if( !pP
2d3d0 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  tr ){.    sqlite
2d3e0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2d3f0 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  name);.    retur
2d400 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2d410 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  KPT;.  }.  pPage
2d420 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
2d430 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
2d440 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
2d450 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
2d460 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2d470 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
2d480 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
2d490 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
2d4a0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2d4b0 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
2d4c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
2d4d0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
2d4e0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d4f0 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2d500 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
2d510 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
2d520 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
2d530 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2d540 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2d550 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
2d560 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2d570 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
2d580 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2d590 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
2d5a0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
2d5b0 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
2d5c0 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
2d5d0 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
2d5e0 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
2d5f0 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
2d600 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  thname ){.    as
2d610 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e  sert( nPathname>
2d620 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
2d630 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63  >zJournal =   (c
2d640 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50  har*)(pPtr += nP
2d650 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55  athname + 1 + nU
2d660 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2d670 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d680 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  e, zPathname, nP
2d690 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  athname);.    if
2d6a0 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28  ( nUri ) memcpy(
2d6b0 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
2d6c0 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c  me[nPathname+1],
2d6d0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
2d6e0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d6f0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
2d700 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2d710 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2d720 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
2d730 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
2d740 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b  rnal\000", 8+2);
2d750 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2d760 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2d770 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d780 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69  r->zJournal);.#i
2d790 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d7a0 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72  T_WAL.    pPager
2d7b0 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72  ->zWal = &pPager
2d7c0 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d7d0 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d  name+8+1];.    m
2d7e0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57  emcpy(pPager->zW
2d7f0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2d800 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2d810 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d820 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  Wal[nPathname], 
2d830 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29  "-wal\000", 4+1)
2d840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2d850 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2d860 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d870 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69  er->zWal);.#endi
2d880 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  f.    sqlite3DbF
2d890 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2d8a0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
2d8b0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
2d8c0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
2d8d0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
2d8e0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
2d8f0 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
2d900 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
2d910 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
2d920 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2d930 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d940 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
2d950 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f  s returned by xO
2d960 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20  pen() */.    rc 
2d970 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
2d980 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46  pVfs, pPager->zF
2d990 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d9a0 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26  >fd, vfsFlags, &
2d9b0 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72  fout);.    asser
2d9c0 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20  t( !memDb );.   
2d9d0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
2d9e0 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
2d9f0 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
2da00 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
2da10 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
2da20 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
2da30 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
2da40 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
2da50 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
2da60 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
2da70 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
2da80 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2da90 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
2daa0 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
2dab0 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
2dac0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
2dad0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2dae0 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
2daf0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
2db00 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2db10 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
2db20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2db30 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
2db40 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
2db50 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
2db60 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2db70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2db80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
2db90 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
2dba0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2dbb0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
2dbc0 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c      if( !readOnl
2dbd0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74  y ){.        set
2dbe0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2dbf0 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2dc00 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rt(SQLITE_DEFAUL
2dc10 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c  T_PAGE_SIZE<=SQL
2dc20 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dc30 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
2dc40 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
2dc50 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
2dc60 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
2dc70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2dc80 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2dc90 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2dca0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2dcb0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2dcc0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
2dcd0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2dce0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2dcf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2dd00 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29  PageDflt = (u32)
2dd10 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2dd20 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ze;.          }.
2dd30 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66          }.#ifdef
2dd40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2dd50 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2dd60 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2dd70 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2dd80 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2dd90 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
2dda0 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
2ddb0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2ddc0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2ddd0 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
2dde0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2ddf0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
2de00 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2de10 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
2de20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
2de30 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
2de40 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2de50 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
2de60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2de70 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
2de80 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
2de90 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  8)) ){.         
2dea0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2deb0 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  = ii;.          
2dec0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2ded0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
2dee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2def0 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2df00 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2df10 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2df20 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20  nolock", 0);.   
2df30 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53 51     if( (iDc & SQ
2df40 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54  LITE_IOCAP_IMMUT
2df50 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20  ABLE)!=0.       
2df60 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  || sqlite3_uri_b
2df70 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2df80 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30  , "immutable", 0
2df90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76  ) ){.          v
2dfa0 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  fsFlags |= SQLIT
2dfb0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2dfc0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2dfd0 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2dfe0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
2dff0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
2e000 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
2e010 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
2e020 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
2e030 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
2e040 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
2e050 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
2e060 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
2e070 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
2e080 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
2e090 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
2e0a0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
2e0b0 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
2e0c0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
2e0d0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2e0e0 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
2e0f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2e100 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
2e110 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
2e120 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
2e130 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
2e140 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2e150 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
2e160 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
2e170 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
2e180 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
2e190 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2e1a0 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e   branch also run
2e1b0 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b  s for files mark
2e1c0 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e  ed as immutable.
2e1d0 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b  .    */ .act_lik
2e1e0 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20  e_temp_file:.   
2e1f0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
2e200 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2e210 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
2e220 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  ;     /* Pretend
2e230 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   we already have
2e240 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70   a lock */.    p
2e250 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45  Pager->eLock = E
2e260 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20  XCLUSIVE_LOCK;  
2e270 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2e280 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45  are in EXCLUSIVE
2e290 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61   mode */.    pPa
2e2a0 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b  ger->noLock = 1;
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2c0 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67  /* Do no locking
2e2d0 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   */.    readOnly
2e2e0 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c   = (vfsFlags&SQL
2e2f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e300 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  Y);.  }..  /* Th
2e310 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c  e following call
2e320 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65   to PagerSetPage
2e330 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f  size() serves to
2e340 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   set the value o
2e350 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61  f .  ** Pager.pa
2e360 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c  geSize and to al
2e370 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
2e380 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
2e390 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
2e3a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e3b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e3c0 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20  r->memDb==0 );. 
2e3d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e3e0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2e3f0 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44  pPager, &szPageD
2e400 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  flt, -1);.    te
2e410 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
2e420 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
2e430 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2e440 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e  e PCache object.
2e450 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2e460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2e470 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
2e480 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74 72 61  00 );.    nExtra
2e490 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2e4a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e4b0 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a  te3PcacheOpen(sz
2e4c0 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61  PageDflt, nExtra
2e4d0 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20  , !memDb,.      
2e4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4f0 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
2e500 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
2e510 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
2e520 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
2e530 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2e540 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66  ccurred above, f
2e550 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20 73  ree the  Pager s
2e560 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2e570 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2e580 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2e590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2e5a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
2e5b0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
2e5c0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
2e5d0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
2e5e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2e5f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2e600 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2e610 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2e620 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2e630 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2e640 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2e650 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2e660 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2e670 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2e680 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e690 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2e6a0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2e6b0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2e6c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2e6d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e6e0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2e6f0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e700 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2e710 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e720 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2e730 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2e740 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2e750 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2e760 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2e770 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2e780 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2e790 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2e7a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2e7b0 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70  NLOCK; */.  /* p
2e7c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
2e7d0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2e7e0 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
2e7f0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
2e800 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
2e810 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e820 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
2e830 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
2e840 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2e850 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2e860 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2e870 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e880 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
2e890 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2e8a0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e8b0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
2e8c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
2e8d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
2e8e0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
2e8f0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
2e900 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2e910 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
2e920 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
2e930 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
2e940 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
2e950 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
2e960 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2e970 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2e980 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
2e990 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
2e9a0 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  llSync==0 );.   
2e9b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e9c0 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b  >extraSync==0 );
2e9d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e9e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2e9f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ea00 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2ea10 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2ea20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ea30 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2ea40 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2ea50 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2ea60 63 20 3d 20 31 3b 0a 23 69 66 20 53 51 4c 49 54  c = 1;.#if SQLIT
2ea70 45 5f 45 58 54 52 41 5f 44 55 52 41 42 4c 45 0a  E_EXTRA_DURABLE.
2ea80 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
2ea90 61 53 79 6e 63 20 3d 20 31 3b 0a 23 65 6c 73 65  aSync = 1;.#else
2eaa0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
2eab0 72 61 53 79 6e 63 20 3d 20 30 3b 0a 23 65 6e 64  raSync = 0;.#end
2eac0 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  if.    pPager->s
2ead0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2eae0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2eaf0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
2eb00 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2eb10 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57  _SYNC_NORMAL | W
2eb20 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
2eb30 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72  IONS;.    pPager
2eb40 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
2eb50 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2eb60 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  RMAL;.  }.  /* p
2eb70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
2eb80 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2eb90 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
2eba0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2ebb0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
2ebc0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
2ebd0 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
2ebe0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
2ebf0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
2ec00 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
2ec10 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
2ec20 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
2ec30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2ec40 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
2ec50 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2ec60 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
2ec70 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2ec80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ec90 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
2eca0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
2ecb0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
2ecc0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2ecd0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2ece0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2ecf0 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
2ed00 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
2ed10 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
2ed20 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
2ed30 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
2ed40 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  /.  pPager->xRei
2ed50 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
2ed60 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
2ed70 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
2ed80 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
2ed90 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70  ash)); */.  /* p
2eda0 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20  Pager->szMmap = 
2edb0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
2edc0 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c  MAP_SIZE // will
2edd0 20 62 65 20 73 65 74 20 62 79 20 62 74 72 65 65   be set by btree
2ede0 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  .c */..  *ppPage
2edf0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2ee00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ee10 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
2ee20 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2ee30 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20  file has not be 
2ee40 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d  deleted or renam
2ee50 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75  ed out from.** u
2ee60 6e 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20  nder the pager. 
2ee70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2ee80 4b 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  K if the databas
2ee90 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20  e is still were 
2eea0 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
2eeb0 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
2eec0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
2eed0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2eee0 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
2eef0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
2ef00 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
2ef10 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
2ef20 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
2ef30 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
2ef40 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
2ef50 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
2ef60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2ef70 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
2ef80 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2ef90 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2efa0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
2efb0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2efc0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
2efd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2efe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2eff0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
2f000 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f010 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
2f020 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2f030 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
2f040 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
2f050 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
2f060 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
2f070 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
2f080 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2f090 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
2f0a0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
2f0b0 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
2f0c0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
2f0d0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
2f0e0 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
2f0f0 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
2f100 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
2f110 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
2f120 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
2f130 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
2f140 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
2f150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2f160 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f170 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
2f180 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
2f190 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
2f1a0 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
2f1b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2f1c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f1d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  n is called afte
2f1e0 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  r transitioning 
2f1f0 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  from PAGER_UNLOC
2f200 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48  K to.** PAGER_SH
2f210 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74  ARED state. It t
2f220 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73  ests if there is
2f230 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70   a hot journal p
2f240 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
2f250 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f260 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
2f270 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  . A hot journal 
2f280 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20  is one that .** 
2f290 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
2f2a0 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69  ed back. Accordi
2f2b0 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ng to this funct
2f2c0 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ion, a hot-journ
2f2d0 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74  al.** file exist
2f2e0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
2f2f0 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20  ng criteria are 
2f300 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  met:.**.**   * T
2f310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f320 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2f330 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a  le system, and.*
2f340 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73  *   * No process
2f350 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
2f360 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
2f370 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2f380 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20  e file, and.**  
2f390 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2f3a0 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67  file itself is g
2f3b0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79  reater than 0 by
2f3c0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64  tes in size, and
2f3d0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73  .**   * The firs
2f3e0 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f  t byte of the jo
2f3f0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f400 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30  s and is not 0x0
2f410 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  0..**.** If the 
2f420 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
2f430 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f440 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
2f450 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
2f460 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
2f470 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
2f480 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
2f490 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
2f4a0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2f4b0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74   same name. In t
2f4c0 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75  his case the jou
2f4d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20  rnal file is.** 
2f4e0 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69  just deleted usi
2f4f0 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45  ng OsDelete, *pE
2f500 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2f510 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a  0 and SQLITE_OK.
2f520 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
2f530 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f540 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63  ne does not chec
2f550 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  k if there is a 
2f560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2f570 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68  ilename.** at th
2f580 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
2f590 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  e. If there is, 
2f5a0 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20  and that master 
2f5b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
2f5c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2f5d0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2f5e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f5f0 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73  lly hot. In this
2f600 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f  .** case this ro
2f610 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
2f620 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2f630 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c  ve. The pager_pl
2f640 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  ayback().** rout
2f650 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65  ine will discove
2f660 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  r that the journ
2f670 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2f680 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a  eally hot and .*
2f690 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
2f6a0 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  it back. .**.** 
2f6b0 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  If a hot-journal
2f6c0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74   file is found t
2f6d0 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74  o exist, *pExist
2f6e0 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e  s is set to 1 an
2f6f0 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d .** SQLITE_OK 
2f700 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20  returned. If no 
2f710 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2f720 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45   is present, *pE
2f730 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20  xists is.** set 
2f740 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
2f750 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2f760 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2f770 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a  rs while trying.
2f780 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
2f790 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2f7a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f7b0 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f  e exists, the IO
2f7c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69   error.** code i
2f7d0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
2f7e0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78  he value of *pEx
2f7f0 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65  ists is undefine
2f800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2f810 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
2f820 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2f830 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
2f840 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
2f850 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
2f860 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
2f870 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2f880 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2f890 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2f8a0 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20  exists = 1;     
2f8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f8c0 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e if a journal f
2f8d0 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ile is present *
2f8e0 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e  /.  int jrnlOpen
2f8f0 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67   = !!isOpen(pPag
2f900 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73  er->jfd);..  ass
2f910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
2f920 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
2f930 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2f940 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73  er->fd) );.  ass
2f950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
2f960 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
2f970 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72  );..  assert( jr
2f980 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73  nlOpen==0 || ( s
2f990 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f9a0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f9b0 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20  ager->jfd) &.   
2f9c0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
2f9d0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
2f9e0 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45  PEN.  ));..  *pE
2f9f0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28  xists = 0;.  if(
2fa00 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fa10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2fa20 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
2fa30 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
2fa40 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2fa50 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
2fa60 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2fa70 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
2fa80 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
2fa90 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
2faa0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
2fab0 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
2fac0 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
2fad0 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63  k */..    /* Rac
2fae0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65  e condition here
2faf0 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65  :  Another proce
2fb00 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  ss might have be
2fb10 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  en holding the. 
2fb20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56     ** the RESERV
2fb30 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65  ED lock and have
2fb40 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20   a journal open 
2fb50 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  at the sqlite3Os
2fb60 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a  Access() .    **
2fb70 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74   call above, but
2fb80 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65   then delete the
2fb90 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f   journal and dro
2fba0 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72  p the lock befor
2fbb0 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20  e.    ** we get 
2fbc0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2fbd0 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52   sqlite3OsCheckR
2fbe0 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61  eservedLock() ca
2fbf0 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20  ll.  If that.   
2fc00 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c   ** is the case,
2fc10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   this routine mi
2fc20 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20  ght think there 
2fc30 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2fc40 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20   when.    ** in 
2fc50 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f  fact there is no
2fc60 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74  ne.  This result
2fc70 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73  s in a false-pos
2fc80 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c  itive which will
2fc90 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74  .    ** be dealt
2fca0 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61   with by the pla
2fcb0 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20  yback routine.  
2fcc0 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20  Ticket #3883..  
2fcd0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2fce0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2fcf0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
2fd00 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
2fd10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fd20 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
2fd30 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  ){.      Pgno nP
2fd40 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2fd50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2fd60 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
2fd70 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2fd80 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2fd90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2fda0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2fdb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2fdc0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2fdd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2fde0 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
2fdf0 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
2fe00 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
2fe10 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
2fe20 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
2fe30 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
2fe40 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
2fe50 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
2fe60 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
2fe70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fe80 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
2fe90 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
2fea0 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
2feb0 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
2fec0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
2fed0 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
2fee0 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
2fef0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
2ff00 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
2ff10 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
2ff20 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
2ff30 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
2ff40 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
2ff50 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
2ff60 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2ff70 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
2ff80 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
2ff90 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
2ffa0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
2ffb0 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
2ffc0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
2ffd0 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
2ffe0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2fff0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
30000 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
30010 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
30020 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
30030 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
30040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
30060 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
30070 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30080 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
30090 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
300a0 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
300b0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
300c0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
300d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
300e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
300f0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
30100 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
30120 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
30130 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
30140 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
30150 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
30160 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
30170 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
30180 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
30190 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
301a0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
301b0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
301c0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
301d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
301e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
301f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
30200 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
30210 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
30220 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
30230 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
30240 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
30250 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
30260 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30270 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
30280 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
30290 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
302a0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
302b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
302c0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
302d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
302e0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
302f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
30300 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
30310 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &f);.          }
30320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
30330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30340 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
30350 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
30360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30370 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
30380 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
30390 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
303a0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
303b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
303c0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
303d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
303e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
303f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30400 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
30410 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
30420 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
30430 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
30440 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30450 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
30460 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29 3b  ts = (first!=0);
30470 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
30480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30490 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
304a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
304b0 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65   cannot open the
304c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
304d0 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  l file in order 
304e0 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20 20  to see if.      
304f0 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73 20        ** it has 
30500 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20 74  a zero header, t
30510 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75 65  hat might be due
30520 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72   to an I/O error
30530 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20  , or.           
30540 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
30550 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65 20  due to the race 
30560 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
30570 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69 6e  bed above and in
30580 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30590 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20 45  ticket #3883.  E
305a0 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75 6d  ither way, assum
305b0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
305c0 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20  al is hot..     
305d0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d         ** This m
305e0 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65 20  ight be a false 
305f0 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20 69  positive.  But i
30600 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74 68  f it is, then th
30610 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
30620 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e   automatic journ
30630 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64 20  al playback and 
30640 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e 69  recovery mechani
30650 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20  sm will deal.   
30660 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68           ** with
30670 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58 43   it under an EXC
30680 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65 72  LUSIVE lock wher
30690 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  e we do not need
306a0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
306b0 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68  ** worry so much
306c0 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64 69   with race condi
306d0 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20  tions..         
306e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
306f0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
30700 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30730 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
30740 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
30750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
30760 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
30770 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ed to obtain a s
30780 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
30790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
307a0 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61  .** It is illega
307b0 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
307c0 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74 69  3PagerGet() unti
307d0 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
307e0 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
307f0 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
30800 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
30810 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
30820 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
30830 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30840 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
30850 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
30860 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
30870 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
30880 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
30890 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
308a0 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
308b0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
308c0 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
308d0 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
308e0 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
308f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
30900 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
30910 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
30920 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
30930 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
30940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30950 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
30960 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
30970 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
30980 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
30990 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
309a0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
309b0 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
309c0 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
309d0 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
309e0 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
309f0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
30a00 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
30a10 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
30a20 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
30a30 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
30a40 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
30a50 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
30a60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
30a70 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
30a80 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
30a90 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
30aa0 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
30ab0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
30ac0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
30ad0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
30ae0 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
30af0 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
30b00 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
30b10 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
30b20 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
30b30 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
30b40 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
30b50 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
30b60 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
30b70 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
30b80 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
30b90 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
30ba0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
30bb0 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
30bc0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
30bd0 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
30be0 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
30bf0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
30c00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
30c10 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
30c20 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
30c30 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
30c40 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
30c50 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
30c60 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
30c70 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
30c80 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
30c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
30ca0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
30cb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
30cc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
30cd0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
30ce0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
30cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d10 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
30d20 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
30d30 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
30d40 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
30d50 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
30d60 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
30d70 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
30d80 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
30d90 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
30da0 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
30db0 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
30dc0 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
30dd0 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
30de0 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
30df0 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
30e00 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
30e10 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
30e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30e30 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
30e40 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
30e50 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
30e60 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
30e70 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
30e80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30e90 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30ea0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
30eb0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
30ec0 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
30ed0 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
30ee0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
30ef0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
30f00 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
30f10 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
30f20 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
30f30 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30f40 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
30f50 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
30f60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30f70 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
30f80 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
30f90 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
30fa0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20  t( !MEMDB );..  
30fb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
30fc0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
30fd0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
30fe0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30ff0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
31000 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31010 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
31020 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31030 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
31040 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31050 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
31060 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
31070 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
31080 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
31090 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
310a0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
310b0 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
310c0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
310d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
310e0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
310f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31100 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
31110 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
31120 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
31130 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
31140 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
31150 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31160 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
31170 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
31180 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
31190 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
311a0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
311b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
311c0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
311d0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
311e0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
311f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
31200 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
31210 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
31220 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
31230 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
31240 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
31250 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
31260 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
31270 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
31280 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
31290 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
312a0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
312b0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
312c0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
312d0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
312e0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
312f0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
31300 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
31310 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
31320 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
31330 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
31340 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
31350 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
31360 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
31370 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
31380 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
31390 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
313a0 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
313b0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
313c0 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
313d0 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
313e0 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
313f0 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
31400 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
31410 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
31420 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
31430 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
31440 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
31450 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
31460 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
31470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31480 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31490 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
314a0 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
314b0 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
314c0 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
314d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
314e0 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
314f0 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
31500 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
31510 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
31520 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
31530 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
31540 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
31550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
31560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
31570 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31580 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
31590 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
315a0 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
315b0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
315c0 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
315d0 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
315e0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
315f0 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
31600 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
31610 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
31620 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
31630 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
31640 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
31650 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
31660 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
31670 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
31680 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
31690 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
316a0 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
316b0 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
316c0 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
316d0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
316e0 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
316f0 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
31700 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
31710 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
31720 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
31730 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
31740 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
31750 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
31760 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
31770 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
31780 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
31790 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
317a0 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
317b0 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
317c0 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
317d0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
317e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
317f0 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
31800 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
31810 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
31820 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
31830 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
31840 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
31850 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
31860 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
31870 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
31880 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
31890 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
318a0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
318b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
318c0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
318d0 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
318e0 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
318f0 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
31900 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
31910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31920 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
31930 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
31940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31950 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
31960 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
31970 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
31980 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
31990 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
319a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
319b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
319c0 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
319d0 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
319e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
319f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31a00 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
31a10 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
31a20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31a30 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
31a40 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
31a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
31a60 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
31a70 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
31a80 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
31a90 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
31aa0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31ab0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
31ac0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
31ad0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
31ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
31af0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
31b00 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
31b10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31b20 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
31b30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
31b40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
31b50 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
31b60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
31b70 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
31b80 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
31b90 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
31ba0 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
31bb0 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
31bc0 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
31bd0 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
31be0 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
31bf0 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
31c00 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
31c10 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
31c20 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
31c30 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
31c40 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
31c50 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
31c60 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
31c70 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
31c80 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
31c90 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
31ca0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
31cb0 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
31cc0 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
31cd0 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
31ce0 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
31cf0 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
31d00 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
31d10 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
31d20 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
31d30 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
31d40 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
31d50 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
31d60 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31d70 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
31d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
31d90 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31da0 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
31db0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
31dc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31dd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
31de0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
31df0 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
31e00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
31e10 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
31e20 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
31e30 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31e40 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
31e50 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
31e60 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
31e70 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31e80 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
31e90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31eb0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
31ec0 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
31ed0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
31ee0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
31ef0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
31f00 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
31f10 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
31f20 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
31f30 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
31f40 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
31f50 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
31f60 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
31f70 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
31f80 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
31f90 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
31fa0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
31fb0 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
31fc0 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
31fd0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
31fe0 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
31ff0 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
32000 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
32010 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
32020 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
32030 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
32040 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
32050 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
32060 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
32070 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
32080 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
32090 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
320a0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
320b0 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
320c0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
320d0 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
320e0 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
320f0 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
32100 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
32110 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
32120 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
32130 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
32140 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
32150 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
32160 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
32170 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
32180 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
32190 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
321a0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
321b0 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
321c0 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
321d0 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
321e0 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
321f0 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
32200 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
32210 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
32220 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
32230 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
32240 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
32250 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
32260 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
32270 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
32280 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
32290 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
322a0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
322b0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
322c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
322d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
322e0 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
322f0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
32300 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
32310 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
32320 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
32330 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
32340 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
32350 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
32360 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
32370 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
32380 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  & pPager->hasHel
32390 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20  dSharedLock ){. 
323a0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
323b0 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
323c0 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 74   been acquired t
323d0 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20 20 20  hen check to.   
323e0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74 68 65     ** see if the
323f0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
32400 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
32410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
32420 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20 20 20  s changed,.     
32430 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 63 61   ** flush the ca
32440 63 68 65 2e 20 20 54 68 65 20 68 61 73 48 65 6c  che.  The hasHel
32450 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67  dSharedLock flag
32460 20 70 72 65 76 65 6e 74 73 20 74 68 69 73 20 66   prevents this f
32470 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  rom.      ** occ
32480 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20 76 65  urring on the ve
32490 72 79 20 66 69 72 73 74 20 61 63 63 65 73 73 20  ry first access 
324a0 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72  to a file, in or
324b0 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a 20 20  der to save a.  
324c0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e      ** single un
324d0 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69 74 65  necessary sqlite
324e0 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c 20 61  3OsRead() call a
324f0 74 20 74 68 65 20 73 74 61 72 74 2d 75 70 2e 0a  t the start-up..
32500 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32510 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
32520 65 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  es are detected 
32530 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
32540 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
32550 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
32560 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
32570 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
32580 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
32590 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
325a0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
325b0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
325c0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
325d0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
325e0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
325f0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
32600 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
32610 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
32620 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
32630 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
32640 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
32650 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
32660 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
32670 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
32680 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
32690 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
326a0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
326b0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
326c0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
326d0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
326e0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
326f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32700 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
32710 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
32720 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
32730 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
32740 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
32750 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
32760 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
32770 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
32780 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
32790 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
327a0 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
327b0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
327c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
327d0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
327e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
327f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
32800 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
32810 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32820 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
32830 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
32840 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
32850 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
32860 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
32870 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32880 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
32890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
328a0 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
328b0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
328c0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
328d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
328e0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
328f0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
32900 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
32910 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
32920 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
32930 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  eset(pPager);.. 
32940 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20         /* Unmap 
32950 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32960 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  e. It is possibl
32970 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20  e that external 
32980 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20  processes.      
32990 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72    ** may have tr
329a0 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61  uncated the data
329b0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
329c0 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62  en extended it b
329d0 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ack.        ** t
329e0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
329f0 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70  ize while this p
32a00 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68  rocess was not h
32a10 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20  olding a lock.. 
32a20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69         ** In thi
32a30 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79  s case there may
32a40 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70   exist a Pager.p
32a50 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74  Map mapping that
32a60 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20   appears.       
32a70 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69   ** to be the ri
32a80 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20  ght size but is 
32a90 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c  not actually val
32aa0 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20  id. Avoid this. 
32ab0 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
32ac0 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69  ility by unmappi
32ad0 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20  ng the db here. 
32ae0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55  */.        if( U
32af0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
32b00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
32b10 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
32b20 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b  ager->fd, 0, 0);
32b30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
32b50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57   If there is a W
32b60 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  AL file in the f
32b70 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e  ile-system, open
32b80 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
32b90 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64  n WAL.    ** mod
32ba0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  e. Otherwise, th
32bb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
32bc0 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e  tion call is a n
32bd0 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
32be0 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57   rc = pagerOpenW
32bf0 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67  alIfPresent(pPag
32c00 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  er);.#ifndef SQL
32c10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
32c20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32c30 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d  >pWal==0 || rc==
32c40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e  SQLITE_OK );.#en
32c50 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
32c60 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32c70 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
32c80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32c90 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
32ca0 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
32cb0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
32cc0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
32cd0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32ce0 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49  OPEN && rc==SQLI
32cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
32d00 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
32d10 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
32d20 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
32d30 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
32d40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32d50 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
32d60 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
32d70 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
32d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32d90 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32da0 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73  R_OPEN );.  }els
32db0 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  e{.    pPager->e
32dc0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
32dd0 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72  ADER;.    pPager
32de0 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
32df0 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ock = 1;.  }.  r
32e00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32e10 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
32e20 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
32e30 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
32e40 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
32e50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
32e60 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
32e70 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
32e80 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
32e90 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
32ea0 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
32eb0 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
32ec0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
32ed0 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
32ee0 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
32ef0 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
32f00 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
32f10 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
32f20 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
32f30 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
32f40 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
32f50 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
32f60 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
32f70 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20  >nMmapOut==0 && 
32f80 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
32f90 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
32fa0 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20  PCache)==0) ){. 
32fb0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
32fc0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
32fd0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
32fe0 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  Acquire a refere
32ff0 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  nce to page numb
33000 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72  er pgno in pager
33010 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a   pPager (a page.
33020 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73  ** reference has
33030 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20   type DbPage*). 
33040 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
33050 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
33060 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
33070 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
33080 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
33090 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
330a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
330b0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
330c0 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
330d0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
330e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
330f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
33100 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
33110 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
33120 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
33130 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
33140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33150 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
33160 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
33170 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
33180 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
33190 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
331a0 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
331b0 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
331c0 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
331d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
331e0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
331f0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
33200 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
33210 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
33220 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
33230 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
33240 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
33250 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
33260 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
33270 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
33280 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
33290 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
332a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
332b0 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
332c0 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
332d0 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
332e0 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
332f0 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
33300 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
33310 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
33320 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
33330 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
33340 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  if a .** non-zer
33350 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  o value is passe
33360 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65  d as the noConte
33370 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64  nt parameter and
33380 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74   the .** request
33390 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  ed page is not a
333a0 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e  lready stored in
333b0 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e   the cache, then
333c0 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64   no .** actual d
333d0 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e  isk read occurs.
333e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
333f0 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
33400 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69  f the .** page i
33410 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
33420 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a   all zeros. .**.
33430 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
33440 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
33450 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
33460 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
33470 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
33480 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
33490 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e  curs in two scen
334a0 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
334b0 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
334c0 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
334d0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
334e0 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
334f0 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
33500 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
33510 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
33520 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
33530 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
33540 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
33550 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
33560 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
33570 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
33580 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
33590 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
335a0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
335b0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
335c0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
335d0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
335e0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
335f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
33600 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
33610 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
33620 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
33630 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
33640 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
33650 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
33660 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
33670 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
33680 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33690 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
336a0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
336b0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
336c0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
336d0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
336e0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
336f0 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
33700 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
33710 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
33720 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
33730 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
33740 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
33750 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
33760 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
33770 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
33780 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
33790 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
337a0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
337b0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
337c0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
337d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
337e0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
337f0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
33800 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
33810 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
33820 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
33830 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
33840 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
33850 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
33860 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
33870 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
33880 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33890 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
338a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
338b0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
338c0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
338d0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
338e0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
338f0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
33900 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
33910 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
33920 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
33930 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
33940 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
33950 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
33960 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
33970 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
33980 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
33990 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
339a0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
339b0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
339c0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
339d0 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
339e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
339f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
33a00 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
33a10 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33a20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
33a30 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
33a40 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
33a50 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
33a60 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
33a70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
33a80 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
33a90 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
33aa0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
33ab0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
33ac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
33ad0 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  _OK;.  PgHdr *pP
33ae0 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72  g = 0;.  u32 iFr
33af0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
33b00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d           /* Fram
33b10 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57  e to read from W
33b20 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e  AL file */.  con
33b30 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  st int noContent
33b40 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
33b50 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
33b60 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63  ;..  /* It is ac
33b70 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20  ceptable to use 
33b80 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61  a read-only (mma
33b90 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20  p) page for any 
33ba0 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a  page except.  **
33bb0 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65   page 1 if there
33bc0 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   is no write-tra
33bd0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72  nsaction open or
33be0 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41   the ACQUIRE_REA
33bf0 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20  DONLY.  ** flag 
33c00 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79  was specified by
33c10 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64   the caller. And
33c20 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20   so long as the 
33c30 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a  db is not a .  *
33c40 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  * temporary or i
33c50 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
33c60 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  e.  */.  const i
33c70 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67  nt bMmapOk = (pg
33c80 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43 48  no>1 && USEFETCH
33c90 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20 28  (pPager).   && (
33ca0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33cb0 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
33cc0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
33cd0 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69  ET_READONLY)).#i
33ce0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
33cf0 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61 67  CODEC.   && pPag
33d00 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65  er->xCodec==0.#e
33d10 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  ndif.  );..  /* 
33d20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74  Optimization not
33d30 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20 22  e:  Adding the "
33d40 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65  pgno<=1" term be
33d50 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68  fore "pgno==0" h
33d60 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20  ere.  ** allows 
33d70 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  the compiler opt
33d80 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20  imizer to reuse 
33d90 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
33da0 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a  he "pgno>1".  **
33db0 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72 65   test in the pre
33dc0 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c  vious statement,
33dd0 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69   and avoid testi
33de0 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68  ng pgno==0 in th
33df0 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61  e.  ** common ca
33e00 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73  se where pgno is
33e10 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28   large. */.  if(
33e20 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f   pgno<=1 && pgno
33e30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
33e40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
33e50 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
33e60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33e70 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
33e80 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
33e90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
33ea0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
33eb0 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74  ssert( noContent
33ec0 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d  ==0 || bMmapOk==
33ed0 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  0 );..  assert( 
33ee0 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
33ef0 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  haredLock==1 );.
33f00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
33f10 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
33f20 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
33f30 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
33f40 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
33f50 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
33f60 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
33f70 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
33f80 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
33f90 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
33fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
33fb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33fc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
33fd0 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
33fe0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33ff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
34000 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
34010 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
34020 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
34030 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34040 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34050 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34060 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
34070 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
34080 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
34090 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
340a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
340b0 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
340c0 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
340d0 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
340e0 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
340f0 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
34100 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
34110 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
34120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34130 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
34140 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
34150 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
34160 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DER ){.         
34170 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
34180 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
34190 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
341a0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
341b0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
341c0 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
341d0 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
341e0 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
341f0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
34200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
34210 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
34220 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
34230 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67  64)(pgno-1)*pPag
34240 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
34250 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
34260 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20          if( pPg 
34270 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34280 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34290 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
342a0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
342b0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
342c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
342d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
342e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
342f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34300 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34310 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34320 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20      }..    {.   
34330 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68     sqlite3_pcach
34340 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20  e_page *pBase;. 
34350 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c       pBase = sql
34360 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
34370 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
34380 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20   pgno, 3);.     
34390 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
343a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
343b0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
343c0 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
343d0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
343e0 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Base);.        i
343f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34400 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
34410 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34420 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
34430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34440 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a   = *ppPage = 0;.
34450 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
34460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
34470 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
34480 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34490 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
344a0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
344b0 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
344c0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
344d0 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
344e0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
344f0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
34500 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 20 20  ( pPg!=0 );.    
34510 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
34520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34530 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20    /* Either the 
34540 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
34550 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65 74  cacheFetch() ret
34560 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f  urned an error o
34570 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  r the.    ** pag
34580 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 69  er was already i
34590 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
345a0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
345b0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
345c0 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20  .    ** Set pPg 
345d0 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f  to 0 and jump to
345e0 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68   the exception h
345f0 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20  andler.  */.    
34600 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  pPg = 0;.    got
34610 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
34620 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  err;.  }.  asser
34630 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
34640 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34650 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
34660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
34670 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
34680 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
34690 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  0 );..  if( pPg-
346a0 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
346b0 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
346c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
346d0 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
346e0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
346f0 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
34700 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
34710 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
34720 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
34730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
34740 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
34750 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
34760 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
34770 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
34780 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
34790 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
347a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
347b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
347c0 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
347d0 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
347e0 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
347f0 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
34800 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
34810 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50  zed.  */..    pP
34820 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
34830 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
34840 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
34850 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
34860 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
34870 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
34880 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
34890 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
348a0 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
348b0 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
348c0 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
348d0 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
348e0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
348f0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34900 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
34910 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34920 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
34930 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34940 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
34950 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
34960 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
34970 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
34980 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
34990 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
349a0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
349b0 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
349c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
349d0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
349e0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
349f0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
34a00 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
34a10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
34a20 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
34a30 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
34a40 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
34a50 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
34a60 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
34a70 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
34a80 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
34a90 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
34aa0 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
34ab0 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
34ac0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
34ad0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
34ae0 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
34af0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
34b00 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
34b10 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
34b20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
34b30 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
34b40 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
34b50 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
34b60 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
34b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
34b80 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
34b90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
34ba0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
34bb0 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
34bc0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34bd0 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
34be0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
34bf0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
34c00 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
34c10 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34c20 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34c30 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
34c40 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
34c50 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
34c60 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
34c70 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
34c80 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
34c90 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
34ca0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
34cb0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
34cc0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
34cd0 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
34ce0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
34cf0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
34d00 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
34d10 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
34d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34d30 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
34d40 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
34d50 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
34d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
34d70 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
34d80 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
34d90 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
34da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34db0 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34dc0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34dd0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34de0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34df0 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
34e00 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
34e10 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
34e20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
34e30 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
34e40 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
34e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34e60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34e70 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34e90 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
34ea0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
34eb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34ec0 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
34ed0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
34ee0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
34ef0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
34f00 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
34f10 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
34f20 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
34f30 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
34f40 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
34f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34f60 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
34f70 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
34f80 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
34f90 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
34fa0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
34fb0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
34fc0 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
34fd0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
34fe0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
34ff0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
35000 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
35010 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
35020 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
35030 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
35040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
35050 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
35060 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
35070 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
35080 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
35090 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
350a0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
350b0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
350c0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
350d0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
350e0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
350f0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
35100 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
35110 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
35120 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
35130 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
35140 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
35150 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
35160 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65   pgno){.  sqlite
35170 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70  3_pcache_page *p
35180 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
35190 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
351a0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
351b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
351c0 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
351d0 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69  ;.  pPage = sqli
351e0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
351f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
35200 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  pgno, 0);.  asse
35210 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
35220 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
35230 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69  haredLock );.  i
35240 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65  f( pPage==0 ) re
35250 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
35260 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
35270 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
35280 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
35290 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pPage);.}../*.*
352a0 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
352b0 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a   reference..**.*
352c0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
352d0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
352e0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
352f0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
35300 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
35310 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
35320 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
35330 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
35340 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
35350 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
35360 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
35370 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
35380 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
35390 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
353a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
353b0 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67  Null(DbPage *pPg
353c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
353d0 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  er;.  assert( pP
353e0 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  g!=0 );.  pPager
353f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35400 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
35410 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b   & PGHDR_MMAP ){
35420 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73  .    pagerReleas
35430 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20  eMapPage(pPg);. 
35440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
35450 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
35460 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67  (pPg);.  }.  pag
35470 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
35480 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64  (pPager);.}.void
35490 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
354a0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
354b0 0a 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c  .  if( pPg ) sql
354c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
354d0 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f  tNull(pPg);.}../
354e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
354f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
35500 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
35510 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
35520 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
35530 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
35540 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
35550 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
35560 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
35570 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
35580 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
35590 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
355a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
355b0 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
355c0 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
355d0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
355e0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
355f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
35600 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
35610 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
35620 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
35630 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
35640 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
35650 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35660 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
35670 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
35680 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
35690 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
356a0 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
356b0 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
356c0 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
356d0 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
356e0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
356f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
35700 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
35710 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
35720 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
35730 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
35740 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
35750 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
35760 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
35770 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
35780 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
35790 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
357a0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
357b0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
357c0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
357d0 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
357e0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
357f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
35800 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
35810 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
35820 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
35830 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
35840 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
35850 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
35860 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
35870 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
35880 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
35890 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
358a0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
358b0 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
358c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
358d0 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
358e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
358f0 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
35900 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
35910 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
35920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35930 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35940 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
35950 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
35960 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
35970 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
35980 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
35990 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
359a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
359b0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
359c0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
359d0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
359e0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
359f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35a00 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35a10 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
35a20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
35a30 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
35a40 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
35a50 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
35a60 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
35a70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
35a80 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
35a90 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
35aa0 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
35ab0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
35ac0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35ad0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
35ae0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
35af0 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
35b00 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
35b10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
35b20 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
35b30 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
35b40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
35b50 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
35b60 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
35b70 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
35b80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
35b90 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
35ba0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35bb0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
35bc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
35bd0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35be0 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
35bf0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
35c00 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
35c10 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
35c20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
35c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
35c40 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
35c50 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
35c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
35c70 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
35c80 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
35c90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
35ca0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
35cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35cc0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
35cd0 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
35ce0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  file */.        
35cf0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
35d00 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
35d10 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
35d20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74        (pPager->t
35d30 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20  empFile ? .     
35d40 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
35d50 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
35d60 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
35d70 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
35d80 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
35d90 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
35da0 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  AL).          );
35db0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  ..        /* Ver
35dc0 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
35dd0 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
35de0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
35df0 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
35e00 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
35e10 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
35e20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
35e30 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
35e40 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
35e50 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
35e60 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66  ITE_OK ){.#ifdef
35e70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
35e80 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
35e90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35ea0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
35ec0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
35ed0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
35ee0 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66  , flags, jrnlBuf
35ef0 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a  ferSize(pPager).
35f00 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c            );.#el
35f10 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
35f20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
35f30 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
35f40 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
35f50 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
35f60 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
35f70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
35f80 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
35f90 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
35fa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
35fb0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
35fc0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
35fd0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
35fe0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
35ff0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
36000 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
36010 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
36020 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
36030 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36040 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
36050 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
36060 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
36070 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
36080 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
36090 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
360a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
360b0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
360c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
360d0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
360e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
360f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
36100 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
36110 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
36120 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
36130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
36140 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
36150 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
36160 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
36170 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
36180 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
36190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
361a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
361b0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
361c0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
361d0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
361e0 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
361f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
36200 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
36210 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
36220 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
36230 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
36240 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
36250 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
36260 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
36270 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
36280 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
36290 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
362a0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
362b0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
362c0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
362d0 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
362e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
362f0 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
36300 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
36310 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
36320 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
36330 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
36340 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
36350 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
36360 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
36370 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
36380 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
36390 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
363a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
363b0 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
363c0 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
363d0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
363e0 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
363f0 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
36400 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
36410 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
36420 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36430 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
36440 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
36450 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
36460 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
36470 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
36480 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
36490 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
364a0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
364b0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
364c0 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
364d0 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
364e0 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
364f0 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
36500 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
36510 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
36520 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
36530 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
36540 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
36550 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
36560 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
36570 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
36580 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
36590 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
365a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
365b0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
365c0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
365d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
365e0 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
365f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
36600 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
36610 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
36620 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
36630 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
36640 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
36650 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
36660 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
36670 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
36680 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
36690 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
366a0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
366b0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
366c0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
366d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
366e0 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
366f0 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
36700 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
36710 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
36720 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
36730 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
36740 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
36750 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
36760 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
36770 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
36780 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
36790 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
367a0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
367b0 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
367c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
367d0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
367e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
367f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
36800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36810 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
36820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36830 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
36840 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
36850 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
36860 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
36870 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
36880 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
36890 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
368a0 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
368b0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
368c0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
368d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
368e0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
368f0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
36900 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
36910 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
36920 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
36930 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
36940 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
36950 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
36960 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
36970 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
36980 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
36990 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
369a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
369b0 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
369c0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
369d0 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
369e0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
369f0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
36a00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36a10 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
36a20 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
36a30 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
36a40 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
36a50 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
36a60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
36a70 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
36a80 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
36a90 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
36aa0 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
36ab0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
36ac0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
36ad0 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
36ae0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
36af0 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
36b00 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
36b10 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36b20 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
36b30 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
36b40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
36b50 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
36b60 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
36b70 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
36b80 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36ba0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36bc0 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
36bd0 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
36be0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
36bf0 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
36c00 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
36c10 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
36c20 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
36c30 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
36c40 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
36c50 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
36c60 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
36c70 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
36c80 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
36c90 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
36ca0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
36cb0 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
36cc0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
36cd0 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
36ce0 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
36cf0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
36d00 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
36d10 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
36d20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
36d30 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
36d40 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
36d50 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
36d60 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
36d70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
36d80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
36d90 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36da0 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
36db0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
36dc0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
36dd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
36de0 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
36df0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
36e00 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
36e10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
36e20 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
36e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
36e40 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
36e50 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
36e60 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
36e70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
36e80 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
36e90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
36ea0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
36eb0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
36ec0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
36ed0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36ee0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36ef0 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
36f00 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
36f10 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
36f20 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
36f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
36f40 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
36f50 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
36f60 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
36f70 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
36f80 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
36f90 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pagerAd
36fa0 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
36fb0 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
36fc0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
36fd0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36fe0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  r;.  int rc;.  u
36ff0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72  32 cksum;.  char
37000 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20   *pData2;.  i64 
37010 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  iOff = pPager->j
37020 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
37030 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
37040 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
37050 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
37060 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  age that.  ** co
37070 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
37080 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
37090 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
370a0 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74   verifies.  ** t
370b0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
370c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
370d0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
370e0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
370f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37100 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
37110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37120 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50  f );.  CODEC2(pP
37130 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
37140 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
37150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37160 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 32  MEM_BKPT, pData2
37170 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70 61 67  );.  cksum = pag
37180 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
37190 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a   (u8*)pData2);..
371a0 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20    /* Even if an 
371b0 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65  IO or diskfull e
371c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
371d0 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
371e0 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  e.  ** page in t
371f0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
37200 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
37210 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
37220 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  age..  ** Otherw
37230 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72  ise, when the tr
37240 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
37250 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f  led back, the lo
37260 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79  gic in.  ** play
37270 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
37280 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
37290 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
372a0 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
372b0 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
372c0 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
372d0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
372e0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
372f0 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72  o,.  ** then cor
37300 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
37310 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ow..  */.  pPg->
37320 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
37330 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20  EED_SYNC;..  rc 
37340 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
37350 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c  ager->jfd, iOff,
37360 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69   pPg->pgno);.  i
37370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37380 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37390 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
373a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
373b0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
373c0 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b  >pageSize, iOff+
373d0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
373e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
373f0 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72 69 74   rc;.  rc = writ
37400 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
37410 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
37420 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
37430 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
37440 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37450 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43  rn rc;..  IOTRAC
37460 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
37470 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
37480 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
37490 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
374a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
374b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
374c0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
374d0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
374e0 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  tej_count);.  PA
374f0 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
37500 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
37510 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
37520 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
37530 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37540 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
37550 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
37560 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
37570 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
37580 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
37590 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
375a0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
375b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
375c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
375d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
375e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
375f0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
37600 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
37610 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37620 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
37630 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
37640 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73  E_NOMEM );.  ass
37650 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
37660 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
37670 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c  _NOMEM );.  rc |
37680 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
37690 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
376a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73  pPg->pgno);.  as
376b0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
376c0 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  _OK || rc==SQLIT
376d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
376e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
376f0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
37700 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
37710 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
37720 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
37730 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
37740 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
37750 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
37760 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
37770 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
37780 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
37790 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
377a0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
377b0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
377c0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
377d0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
377e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
377f0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
37800 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
37810 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
37820 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
37830 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
37840 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
37850 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
37860 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
37880 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
37890 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
378a0 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
378b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
378c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
378d0 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
378e0 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
378f0 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
37900 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
37910 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
37920 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
37930 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
37940 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
37950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37960 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37970 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
37980 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
37990 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
379a0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
379b0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
379c0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
379d0 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
379e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
379f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37a10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20  ger->errCode==0 
37a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37a30 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ger->readOnly==0
37a40 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41 47 45   );.  CHECK_PAGE
37a50 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  (pPg);..  /* The
37a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
37a70 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  eds to be opened
37a80 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72  . Higher level r
37a90 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72  outines have alr
37aa0 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  eady.  ** obtain
37ab0 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ed the necessary
37ac0 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20   locks to begin 
37ad0 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  the write-transa
37ae0 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20  ction, but the. 
37af0 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75   ** rollback jou
37b00 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
37b10 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e  et be open. Open
37b20 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20   it now if this 
37b30 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a  is the case..  *
37b40 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64  *.  ** This is d
37b50 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  one before calli
37b60 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
37b70 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74  MakeDirty() on t
37b80 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f  he page. .  ** O
37b90 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74 20  therwise, if it 
37ba0 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20  were done after 
37bb0 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
37bc0 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
37bd0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65  , then.  ** an e
37be0 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72  rror might occur
37bf0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 77   and the pager w
37c00 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57  ould end up in W
37c10 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
37c20 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67  te.  ** with pag
37c30 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  es marked as dir
37c40 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ty in the cache.
37c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
37c60 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37c70 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37c80 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
37c90 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
37ca0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
37cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
37cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37ce0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
37cf0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29  RITER_CACHEMOD )
37d00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
37d10 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
37d20 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20  Pager) );..  /* 
37d30 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 74 68  Mark the page th
37d40 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  at is about to b
37d50 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 64 69  e modified as di
37d60 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rty. */.  sqlite
37d70 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37d80 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
37d90 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
37da0 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20 74 68  al is in use, th
37db0 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  em make sure the
37dc0 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61 62   page that is ab
37dd0 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e  out.  ** to chan
37de0 67 65 20 69 73 20 69 6e 20 74 68 65 20 72 6f 6c  ge is in the rol
37df0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f  lback journal, o
37e00 72 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  r if the page is
37e10 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66 66 0a   a new page off.
37e20 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66    ** then end of
37e30 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20   the file, make 
37e40 73 75 72 65 20 69 74 20 69 73 20 6d 61 72 6b 65  sure it is marke
37e50 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f  d as PGHDR_NEED_
37e60 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  SYNC..  */.  ass
37e70 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 70 49  ert( (pPager->pI
37e80 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20  nJournal!=0) == 
37e90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
37ea0 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
37eb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
37ec0 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  =0.   && sqlite3
37ed0 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
37ee0 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  l(pPager->pInJou
37ef0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
37f00 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  ==0.  ){.    ass
37f10 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
37f20 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
37f30 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
37f40 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
37f50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
37f60 20 3d 20 70 61 67 65 72 41 64 64 50 61 67 65 54   = pagerAddPageT
37f70 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c  oRollbackJournal
37f80 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
37f90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37fa0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37fb0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
37fd0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37fe0 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  !=PAGER_WRITER_D
37ff0 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20  BMOD ){.        
38000 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
38010 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
38020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
38030 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
38040 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
38050 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
38060 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
38070 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
38080 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
38090 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
380a0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
380b0 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20  ?1:0)));.    }. 
380c0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 47 48   }..  /* The PGH
380d0 44 52 5f 44 49 52 54 59 20 62 69 74 20 69 73 20  DR_DIRTY bit is 
380e0 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e 20 74  set above when t
380f0 68 65 20 70 61 67 65 20 77 61 73 20 61 64 64 65  he page was adde
38100 64 20 74 6f 20 74 68 65 20 64 69 72 74 79 2d 6c  d to the dirty-l
38110 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66  ist.  ** and bef
38120 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 65 20  ore writing the 
38130 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 72 6f  page into the ro
38140 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
38150 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c   Wait until now,
38160 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20  .  ** after the 
38170 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 73 75  page has been su
38180 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e  ccessfully journ
38190 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20 73 65  alled, before se
381a0 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50  tting the.  ** P
381b0 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 20 62  GHDR_WRITEABLE b
381c0 69 74 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  it that indicate
381d0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
381e0 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 6d 6f  can be safely mo
381f0 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  dified..  */.  p
38200 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
38210 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a 20 20  DR_WRITEABLE;.  
38220 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61  .  /* If the sta
38230 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
38240 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
38250 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
38260 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74  ,.  ** then writ
38270 65 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  e the page into 
38280 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
38290 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
382a0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
382b0 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20 72 63  oint>0 ){.    rc
382c0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
382d0 65 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29  eIfRequired(pPg)
382e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
382f0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
38300 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
38310 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
38320 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67  ->dbSize<pPg->pg
38330 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
38340 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
38350 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pgno;.  }.  retu
38360 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38370 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
38380 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61 67 65  t of sqlite3Page
38390 72 57 72 69 74 65 28 29 20 74 68 61 74 20 72 75  rWrite() that ru
383a0 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65 63 74  ns when the sect
383b0 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61  or size.** is la
383c0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
383d0 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69 74 65  ge size.  SQLite
383e0 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65 61 73   makes the (reas
383f0 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70 74 69  onable) assumpti
38400 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62  on that.** all b
38410 79 74 65 73 20 6f 66 20 61 20 73 65 63 74 6f 72  ytes of a sector
38420 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 67   are written tog
38430 65 74 68 65 72 20 62 79 20 68 61 72 64 77 61 72  ether by hardwar
38440 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62  e.  Hence, all b
38450 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63  ytes of.** a sec
38460 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  tor need to be j
38470 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73  ournalled in cas
38480 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  e of a power los
38490 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  s in the middle 
384a0 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a  of.** a write..*
384b0 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
384c0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
384d0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
384e0 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67 65 20  ual to the page 
384f0 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a  size, in which.*
38500 2a 20 63 61 73 65 20 70 61 67 65 73 20 63 61 6e  * case pages can
38510 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79   be individually
38520 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69 73 20   written.  This 
38530 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e  routine only run
38540 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65  s in the.** exce
38550 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 77 68 65  ptional case whe
38560 72 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  re the page size
38570 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
38580 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
38590 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
385a0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
385b0 70 61 67 65 72 57 72 69 74 65 4c 61 72 67 65 53  pagerWriteLargeS
385c0 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70 50 67  ector(PgHdr *pPg
385d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
385e0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
385f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
38600 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65   */.  Pgno nPage
38610 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
38620 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
38630 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
38640 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
38650 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
38660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38670 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
38680 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
38690 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
386a0 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30  .  int nPage = 0
386b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
386c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
386d0 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
386e0 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
386f0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
38700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38710 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
38720 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53 79 6e  */.  in