/ Hex Artifact Content
Login

Artifact 919d4e7eaf27646c290b45c9d6e0ae109f562b3d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  +.**            
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73  f.};../*.** Bits
5240: 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f   of the Pager.do
5250: 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20  NotSpill flag.  
5260: 53 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63  See further desc
5270: 72 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a  ription below..*
5280: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5290: 4c 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20  LAG_OFF         
52a0: 30 78 30 31 20 20 20 20 20 20 2f 2a 20 4e 65 76  0x01      /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 20 20 20 20 20 2f 2a 20 43 75   0x02      /* Cu
5300: 72 72 65 6e 74 20 72 6f 6c 6c 69 6e 67 20 62 61  rrent rolling ba
5310: 63 6b 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 73 70  ck, so do not sp
5320: 69 6c 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ill */.#define S
5330: 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
5340: 20 20 20 20 20 30 78 30 34 20 20 20 20 20 20 2f       0x04      /
5350: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5360: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5370: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  /../*.** A open 
5380: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
5390: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74 72   instance of str
53a0: 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65 73  uct Pager. A des
53b0: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 73  cription of.** s
53c0: 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65 20  ome of the more 
53d0: 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65 72  important member
53e0: 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c 6f   variables follo
53f0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74 65  ws:.**.** eState
5400: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75 72  .**.**   The cur
5410: 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66 20  rent 'state' of 
5420: 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
5430: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
5440: 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20 20  t and state.**  
5450: 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20 66   diagram above f
5460: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
5470: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73 74   of the pager st
5480: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63 6b  ate..**.** eLock
5490: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 72  .**.**   For a r
54a0: 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74 61  eal on-disk data
54b0: 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65 6e  base, the curren
54c0: 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  t lock held on t
54d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
54e0: 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 2c   -.**   NO_LOCK,
54f0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
5500: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
5510: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
5520: 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65 6d  *.**   For a tem
5530: 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d  porary or in-mem
5540: 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e 65  ory database (ne
5550: 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 72  ither of which r
5560: 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20 20  equire any.**   
5570: 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61 72  locks), this var
5580: 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73 20  iable is always 
5590: 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56 45  set to EXCLUSIVE
55a0: 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75 63  _LOCK. Since suc
55b0: 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65 73  h.**   databases
55c0: 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61 67   always have Pag
55d0: 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  er.exclusiveMode
55e0: 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b 73  ==1, this tricks
55f0: 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20 20   the pager.**   
5600: 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e 6b  logic into think
5610: 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72 65  ing that it alre
5620: 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65 20  ady has all the 
5630: 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65 76  locks it will ev
5640: 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61 6e  er.**   need (an
5650: 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20 72  d no reason to r
5660: 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a 2a  elease them)..**
5670: 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28 6f  .**   In some (o
5680: 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73 74  bscure) circumst
5690: 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72 69  ances, this vari
56a0: 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62 65  able may also be
56b0: 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e 4b   set to.**   UNK
56c0: 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
56d0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
56e0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
56f0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
5700: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
5710: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
5720: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
5730: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
5740: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
5750: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
5760: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5770: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
5780: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
5790: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
57a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
57b0: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
57c0: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
57d0: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
57e0: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
57f0: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
5800: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
5810: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
5820: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
5830: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
5840: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
5850: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
5860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
5870: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
5880: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
5890: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
58a0: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
58b0: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
58c0: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
58d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
58e0: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
58f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
5900: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
5910: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
5920: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
5930: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
5940: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
5950: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
5960: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
5970: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
5980: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
5990: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
59a0: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
59b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
59c0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
59d0: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
59e0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
59f0: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
5a00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5a10: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
5a20: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
5a30: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
5a40: 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73 74  d..**.** setMast
5a50: 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  er.**.**   When 
5a60: 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
5a70: 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  One() is called 
5a80: 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61 6e  to commit a tran
5a90: 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 0a  saction, it may.
5aa0: 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f 74  **   (or may not
5ab0: 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73 74  ) specify a mast
5ac0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
5ad0: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
5ae0: 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f 75  to the .**   jou
5af0: 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
5b00: 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74 6f   it is synced to
5b10: 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 57   disk..**.**   W
5b20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
5b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
5b40: 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d 6a  tains a master-j
5b50: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
5b60: 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68 65  ffects .**   the
5b70: 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74 68   way in which th
5b80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5b90: 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74 65  s finalized afte
5ba0: 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
5bb0: 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d 69  n is .**   commi
5bc0: 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
5bd0: 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67  ack when running
5be0: 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   in "journal_mod
5bf0: 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65 2e  e=PERSIST" mode.
5c00: 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72 6e  .**   If a journ
5c10: 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
5c20: 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65   contain a maste
5c30: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5c40: 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66 69  r, it is.**   fi
5c50: 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72 77  nalized by overw
5c60: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
5c70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5c80: 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66 0a  with zeroes. If.
5c90: 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f 6e  **   it does con
5ca0: 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a 6f  tain a master-jo
5cb0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74 68  urnal pointer th
5cc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
5cd0: 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a 20  s finalized .** 
5ce0: 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67 20    by truncating 
5cf0: 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  it to zero bytes
5d00: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68 65  , just as if the
5d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72 65   connection were
5d20: 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20 69   .**   running i
5d30: 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  n "journal_mode=
5d40: 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e 0a  truncate" mode..
5d50: 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c 20  **.**   Journal 
5d60: 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74 61  files that conta
5d70: 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  in master journa
5d80: 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e 6f  l pointers canno
5d90: 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  t be finalized.*
5da0: 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f 76  *   simply by ov
5db0: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5dc0: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
5dd0: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c 20  er with zeroes, 
5de0: 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73 74  as the.**   mast
5df0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
5e00: 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66 65  er could interfe
5e10: 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75 72  re with hot-jour
5e20: 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  nal rollback of 
5e30: 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71 75  any.**   subsequ
5e40: 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74 65  ently interrupte
5e50: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  d transaction th
5e60: 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a 6f  at reuses the jo
5e70: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5e80: 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73 20  *   The flag is 
5e90: 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e 20  cleared as soon 
5ea0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
5eb0: 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  ile is finalized
5ec0: 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62 79   (either.**   by
5ed0: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5ee0: 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f 6c  eTwo or PagerRol
5ef0: 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49 4f  lback). If an IO
5f00: 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73 20   error prevents 
5f10: 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  the.**   journal
5f20: 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67   file from being
5f30: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66 69   successfully fi
5f40: 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65 74  nalized, the set
5f50: 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20 20  Master flag.**  
5f60: 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79 77   is cleared anyw
5f70: 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67 65  ay (and the page
5f80: 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20 45  r will move to E
5f90: 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a 0a  RROR state)..**.
5fa0: 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a 2a  ** doNotSpill.**
5fb0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
5fc0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5fd0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5fe0: 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c 6c  he-spills  (call
5ff0: 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20 74  s made by.**   t
6000: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6010: 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72   to the pagerStr
6020: 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ess() routine to
6030: 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64 61   write cached da
6040: 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20 66  ta.**   to the f
6050: 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72  ile-system in or
6060: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
6070: 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  emory)..**.**   
6080: 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c 46  When bits SPILLF
6090: 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c 4c  LAG_OFF or SPILL
60a0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f 66  FLAG_ROLLBACK of
60b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65 20   doNotSpill are 
60c0: 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69 6e  set,.**   writin
60d0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
60e0: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
60f0: 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  ss() is disabled
6100: 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 20   altogether..** 
6110: 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f    The SPILLFLAG_
6120: 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69 73  ROLLBACK case is
6130: 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20   done in a very 
6140: 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61  obscure case tha
6150: 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20  t.**   comes up 
6160: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
6170: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72   rollback that r
6180: 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63  equires the pcac
6190: 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74  he module.**   t
61a0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
61b0: 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74   page to prevent
61c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
61d0: 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69  e from being wri
61e0: 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20  tten.**   while 
61f0: 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76  it is being trav
6200: 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ersed by code in
6210: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6220: 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41  ).  The SPILLFLA
6230: 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65 20  G_OFF.**   case 
6240: 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65 72  is a user prefer
6250: 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49  ence..** .**   I
6260: 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47 5f  f the SPILLFLAG_
6270: 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
6280: 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  t, writing to th
6290: 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20  e database from 
62a0: 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
62b0: 20 20 20 69 73 20 70 65 72 6d 69 74 74 65 64 2c     is permitted,
62c0: 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68 65   but syncing the
62d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
62e0: 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c 61 67 20   not. This flag 
62f0: 69 73 20 73 65 74 0a 2a 2a 20 20 20 62 79 20 73  is set.**   by s
6300: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
6310: 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  () when the file
6320: 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d 73  -system sector-s
6330: 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ize is larger th
6340: 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61  an.**   the data
6350: 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20 69  base page-size i
6360: 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76 65  n order to preve
6370: 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  nt a journal syn
6380: 63 20 66 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67  c from happening
6390: 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74 77 65 65   .**   in betwee
63a0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63b0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63c0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63d0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63e0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
63f0: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6400: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6410: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6420: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6430: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6440: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6460: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6470: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6480: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
6490: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64a0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64b0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64c0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64d0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64e0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
64f0: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6500: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6510: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6520: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6530: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6540: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6550: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6570: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6580: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
6590: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65a0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65b0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65c0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65d0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65e0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
65f0: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6600: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6610: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6620: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6630: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6640: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6650: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6660: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6670: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6680: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
6690: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66a0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66b0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66c0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66d0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66e0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
66f0: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6700: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6710: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6720: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6730: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6740: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6750: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6760: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6770: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6780: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
6790: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67a0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67b0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67c0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67d0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67e0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
67f0: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6800: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6810: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6820: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6830: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6840: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6850: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6860: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6870: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6880: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
6890: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68b0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68c0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68d0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68e0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
68f0: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6900: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6910: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6920: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6930: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6940: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6950: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6960: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6970: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6980: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
6990: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69b0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69c0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69d0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69e0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
69f0: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a00: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a10: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a30: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a50: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a60: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a70: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a80: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6a90: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6aa0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ab0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ac0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ad0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6ae0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6af0: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b00: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b10: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b20: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b30: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b40: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b50: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b60: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b70: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b80: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6b90: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6ba0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bb0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bc0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6bd0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6be0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6bf0: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c00: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c10: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c20: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c30: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c40: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c50: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c60: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c70: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c80: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6c90: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6ca0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cb0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cc0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6cd0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6ce0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6cf0: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d00: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d10: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d20: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d30: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d40: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d50: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d60: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d70: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d80: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6d90: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6da0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6db0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dc0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6dd0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6de0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6df0: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e00: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e10: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e20: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e30: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e40: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e50: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e60: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e70: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e80: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6e90: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6ea0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6eb0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ec0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ed0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ee0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6ef0: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f00: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f10: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f20: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f30: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f40: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f50: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f60: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f70: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f80: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6f90: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fa0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fb0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fc0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fd0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6fe0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
6ff0: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7000: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7010: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7020: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7030: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7040: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7050: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7060: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7070: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7080: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
7090: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70a0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70b0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70c0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70d0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70e0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
70f0: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7100: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7110: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7120: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7130: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65  ..*/.struct Page
7140: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r {.  sqlite3_vf
7150: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
7160: 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e    /* OS function
7170: 73 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20  s to use for IO 
7180: 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76  */.  u8 exclusiv
7190: 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  eMode;          
71a0: 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75   /* Boolean. Tru
71b0: 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  e if locking_mod
71c0: 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a  e==EXCLUSIVE */.
71d0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65    u8 journalMode
71e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
71f0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 50 41 47 45   One of the PAGE
7200: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
7210: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 75  values */.  u8 u
7220: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
7230: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
7240: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
7250: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
7260: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
7290: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
72a0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
72b0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
72c0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
72d0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
72e0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
72f0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74  ess */.  u8 ckpt
7300: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7310: 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52       /* SYNC_NOR
7320: 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c  MAL or SYNC_FULL
7330: 20 66 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20   for checkpoint 
7340: 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46  */.  u8 walSyncF
7350: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7360: 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20   /* SYNC_NORMAL 
7370: 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72  or SYNC_FULL for
7380: 20 77 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20   wal writes */. 
7390: 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20   u8 syncFlags;  
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73b0: 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53  SYNC_NORMAL or S
73c0: 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69  YNC_FULL otherwi
73d0: 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  se */.  u8 tempF
73e0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
73f0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
7400: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
7410: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
7420: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
7430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7440: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7450: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7460: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7470: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7480: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7490: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
74a0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
74b0: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
74c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
74d0: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
74e0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
74f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7550: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7560: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7570: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7580: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7590: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
75a0: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
75b0: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
75c0: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
75d0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
75e0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
75f0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
7600: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
7610: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
7620: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
7630: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7640: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7650: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7660: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7680: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7690: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
76a0: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
76b0: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
76c0: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
76d0: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
76e0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
76f0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
7700: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
7710: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
7720: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
7730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7740: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7750: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7760: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7770: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7790: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
77a0: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
77b0: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
77c0: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
77d0: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
77e0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
77f0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
7800: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
7810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7820: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
7830: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7840: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7850: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7860: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7870: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7880: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7890: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
78a0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20  subjInMemory;   
78b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
78c0: 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72   to use in-memor
78d0: 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  y sub-journals *
78e0: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
7910: 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
7920: 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f  se */.  Pgno dbO
7930: 72 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rigSize;        
7940: 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65      /* dbSize be
7950: 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
7960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
7970: 20 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a    Pgno dbFileSiz
7980: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7990: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
79a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
79b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
79c0: 64 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20  dbHintSize;     
79d0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
79e0: 70 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f  passed to FCNTL_
79f0: 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a  SIZE_HINT call *
7a00: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
7a30: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
7a40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72     /* Pages jour
7a70: 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73  nalled since las
7a80: 74 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74  t j-header writt
7a90: 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  en */.  u32 cksu
7aa0: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  mInit;          
7ab0: 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e      /* Quasi-ran
7ac0: 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20  dom value added 
7ad0: 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75  to every checksu
7ae0: 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52  m */.  u32 nSubR
7af0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
7b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7b10: 72 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20  records written 
7b20: 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  to sub-journal *
7b30: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a  /.  Bitvec *pInJ
7b40: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7b50: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
7b60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
7b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7b80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7b90: 2a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *fd;           /
7ba0: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7bb0: 72 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a  r for database *
7bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
7bd0: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
7be0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
7bf0: 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72  or for main jour
7c00: 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  nal */.  sqlite3
7c10: 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20  _file *sjfd;    
7c20: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7c30: 63 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d  criptor for sub-
7c40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
7c50: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
7c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
7c70: 65 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74  ent write offset
7c80: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
7c90: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
7ca0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
7cb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
7cc0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
7cd0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7ce0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63  */.  sqlite3_bac
7cf0: 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20  kup *pBackup;   
7d00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c   /* Pointer to l
7d10: 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62  ist of ongoing b
7d20: 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
7d30: 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  */.  PagerSavepo
7d40: 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b  int *aSavepoint;
7d50: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74   /* Array of act
7d60: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a  ive savepoints *
7d70: 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  /.  int nSavepoi
7d80: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
7d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
7da0: 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f  ments in aSavepo
7db0: 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20  int[] */.  char 
7dc0: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
7dd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
7de0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
7df0: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
7e00: 20 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65   */..  u8 bUseFe
7e10: 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
7e20: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
7e30: 65 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20  e xFetch() */.  
7e40: 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20  int nMmapOut;   
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e60: 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61  umber of mmap pa
7e70: 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75  ges currently ou
7e80: 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73  tstanding */.  s
7e90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
7ea0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65  map;       /* De
7eb0: 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d  sired maximum mm
7ec0: 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48  ap size */.  PgH
7ed0: 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73  dr *pMmapFreelis
7ee0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t;       /* List
7ef0: 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61   of free mmap pa
7f00: 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72  ge headers (pDir
7f10: 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ty) */.  /*.  **
7f20: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7f30: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7f40: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7fa0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7fc0: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7fd0: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7fe0: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7ff0: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
8000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8010: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
8020: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
8030: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
8040: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
8060: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
8070: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
8080: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
80a0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
80b0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
80c0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
80d0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
80e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80f0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
8100: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
8110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8120: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
8130: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
8140: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
8150: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
8160: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
8170: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
8180: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
8190: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
81a0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
81b0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
81c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
81d0: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
81e0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
81f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
8200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8210: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
8220: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
8230: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
8240: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
8250: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
8260: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
8270: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
8280: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
8290: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
82a0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
82b0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
82c0: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
82d0: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
82e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
82f0: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8320: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8330: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8340: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
8350: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
8360: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
8370: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
8380: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8390: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
83a0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
83b0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
83c0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
83d0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
83e0: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
83f0: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8400: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8410: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8420: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8430: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8440: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
8450: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
8460: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
8470: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
8480: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8490: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
84a0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
84b0: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
84c0: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
84d0: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
84e0: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
84f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8500: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8510: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8520: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8530: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8540: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
8550: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8560: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
8570: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
8580: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8590: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
85a0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
85b0: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
85c0: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
85d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
85e0: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
85f0: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8600: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8610: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8620: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8630: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8640: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
8650: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
8660: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
8670: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
8680: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
8690: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
86a0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
86b0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
86c0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
86d0: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
86e0: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
86f0: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8700: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8710: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8720: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8730: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8740: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
8750: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
8760: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
8770: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
8780: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
8790: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
87a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
87b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
87c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
87d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
87e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
87f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8800: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8810: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8820: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8830: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8840: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
8850: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
8860: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8870: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
8880: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8890: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
88a0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
88b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
88c0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
88d0: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
88e0: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
88f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8900: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8910: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8920: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8930: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8940: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
8950: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
8960: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
8970: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
8980: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
8990: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
89a0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
89b0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
89c0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
89d0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
89e0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
89f0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8a00: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8a10: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8a20: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8a30: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8a40: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
8a50: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
8a60: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
8a70: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
8a80: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
8a90: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
8aa0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8ab0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8ac0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8ad0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8ae0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8af0: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8b00: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8b10: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8b20: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8b30: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8b40: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
8b50: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
8b60: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
8b70: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8b80: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
8b90: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8ba0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8bb0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8bc0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8bd0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8be0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8bf0: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8c00: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8c10: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8c20: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8c30: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8c40: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
8c50: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
8c60: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
8c70: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
8c80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
8c90: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
8ca0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8cb0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8cc0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8cd0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8ce0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8cf0: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8d00: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8d10: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8d20: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8d30: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8d40: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8d50: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8d60: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8d70: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8d80: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8d90: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8da0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8db0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8dc0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8dd0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8de0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8df0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8e00: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8e10: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8e20: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8e30: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8e40: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8e50: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8e60: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8e70: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8e80: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8e90: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8ea0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8eb0: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8ec0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8ed0: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8ee0: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8ef0: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8f00: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8f10: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8f20: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8f30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8f40: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8f50: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8f60: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8f70: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8f80: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8f90: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8fa0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8fb0: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8fc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8fd0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8fe0: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8ff0: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
9000: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
9010: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
9020: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
9030: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
9040: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
9050: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
9060: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
9070: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
9080: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
9090: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
90a0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
90b0: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
90c0: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
90d0: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
90e0: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
90f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
9100: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
9110: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
9120: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
9130: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
9140: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
9150: 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20  cro USEFETCH is 
9160: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61  true if we are a
9170: 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68  llowed to use th
9180: 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e  e xFetch and xUn
9190: 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61  fetch.** interfa
91a0: 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  ces to access th
91b0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
91c0: 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
91d0: 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  /O..*/.#if SQLIT
91e0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
91f0: 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  0.# define USEFE
9200: 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55 73  TCH(x) ((x)->bUs
9210: 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23 20  eFetch).#else.# 
9220: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9230: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
9240: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c  ** The maximum l
9250: 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
9260: 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a   is (2^31 - 1)..
9270: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
9280: 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38  _MAX_PGNO 214748
9290: 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  3647../*.** The 
92a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
92b0: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
92c0: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
92d0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
92e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
92f0: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
9300: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
9310: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
9320: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
9330: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
9340: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
9350: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
9360: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
9370: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
9380: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
9390: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
93a0: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
93b0: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
93c0: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
93d0: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
93e0: 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )../*.** Return 
93f0: 74 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67  true if this pag
9400: 65 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d  er uses a write-
9410: 61 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61  ahead log instea
9420: 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a  d of the usual.*
9430: 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
9440: 61 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61  al. Otherwise fa
9450: 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  lse..*/.#ifndef 
9460: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
9470: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9480: 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50  UseWal(Pager *pP
9490: 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
94a0: 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30  (pPager->pWal!=0
94b0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
94c0: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
94d0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
94e0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
94f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9500: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
9510: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
9520: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
9530: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9540: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9550: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9560: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9570: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9580: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9590: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
95a0: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
95b0: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
95c0: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
95d0: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
95e0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
95f0: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9600: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9610: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9620: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9630: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9640: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9650: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9660: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9670: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9680: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9690: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
96a0: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
96b0: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
96c0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
96d0: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
96e0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
96f0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9700: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9710: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9720: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9730: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9740: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9750: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9760: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9770: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9780: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9790: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
97a0: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
97b0: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
97c0: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
97d0: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
97e0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
97f0: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9800: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9810: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9830: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9840: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9850: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9860: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9870: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9880: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9890: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
98a0: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
98b0: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
98c0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
98d0: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
98e0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
98f0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9900: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9910: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9920: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9930: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9940: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9950: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9960: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9970: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9980: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9990: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
99a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
99b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
99c0: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
99d0: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
99e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
99f0: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9a00: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9a10: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9a20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9a30: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9a40: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9a50: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
9a60: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
9a70: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
9a80: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
9a90: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
9aa0: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
9ab0: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9ac0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9ad0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9ae0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9af0: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9b00: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9b10: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9b20: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9b30: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
9b40: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
9b50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
9b60: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
9b70: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9b80: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
9b90: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
9ba0: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
9bb0: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
9bc0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
9bd0: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
9be0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
9bf0: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
9c00: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
9c10: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61  >noSync );.    a
9c20: 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61  ssert( p->journa
9c30: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c40: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c50: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9c60: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9c70: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
9c80: 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61  RY .    );.    a
9c90: 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65  ssert( p->eState
9ca0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
9cb0: 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45   p->eState!=PAGE
9cc0: 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73  R_OPEN );.    as
9cd0: 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
9ce0: 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  l(p)==0 );.  }..
9cf0: 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f    /* If changeCo
9d00: 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20  untDone is set, 
9d10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
9d20: 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
9d30: 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20  be held.  ** on 
9d40: 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
9d50: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d60: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9d70: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
9d80: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49   p->eLock!=PENDI
9db0: 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77  NG_LOCK );..  sw
9dc0: 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20  itch( p->eState 
9dd0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
9de0: 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73  R_OPEN:.      as
9df0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9e00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e10: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9e30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9e40: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
9e50: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9e60: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==0 || pPager->t
9e70: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
9e80: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9e90: 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a  e PAGER_READER:.
9ea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9eb0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
9ec0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9ed0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ee0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9ef0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f00: 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ( p->eLock>=SHAR
9f10: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
9f20: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
9f30: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e PAGER_WRITER_L
9f40: 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73  OCKED:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9fd0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9fe0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
9ff0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a000: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a010: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a020: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a030: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a040: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a050: 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  FileSize );.    
a060: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a070: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a080: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a090: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a0a0: 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  ( pPager->setMas
a0b0: 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ter==0 );.      
a0c0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a0d0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
a0e0: 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73  CHEMOD:.      as
a0f0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a100: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a110: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a120: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a130: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a140: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a150: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a160: 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70        /* It is p
a170: 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20  ossible that if 
a180: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a190: 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68   here that neith
a1a0: 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  er the.        *
a1b0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
a1c0: 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20  or the WAL file 
a1d0: 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68  are open. This h
a1e0: 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20  appens during.  
a1f0: 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62        ** a rollb
a200: 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ack transaction 
a210: 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72  that switches fr
a220: 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  om journal_mode=
a230: 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  off.        ** t
a240: 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  o journal_mode=w
a250: 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  al..        */. 
a260: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a270: 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ->eLock>=RESERVE
a280: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a290: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a2a0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a2b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a2c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a2d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a2e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a2f0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a300: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a310: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20  DE_WAL .        
a320: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a330: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a340: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a350: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
a360: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a370: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a380: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
a390: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a3a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a3b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  e PAGER_WRITER_D
a3c0: 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  BMOD:.      asse
a3d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  rt( p->eLock==EX
a3e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a400: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a410: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a420: 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
a430: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a440: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a450: 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53  p->eLock>=EXCLUS
a460: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a470: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a480: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a490: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a4a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a4b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a4c0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a4d0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a4e0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a4f0: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a500: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a510: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70  r->dbOrigSize<=p
a520: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a530: 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e );.      break
a540: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a550: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
a560: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a570: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a580: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a5a0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a5b0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a5c0: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a5d0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
a5f0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20  pen(p->jfd) .   
a600: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a610: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a620: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
a640: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a650: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a660: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
a670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a680: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
a690: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
a6a0: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
a6b0: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
a6c0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
a6d0: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
a6e0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
a6f0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
a700: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
a710: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
a720: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
a730: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
a740: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
a750: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a760: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
a770: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a790: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a7a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
a7b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a7c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b    }..  return 1;
a7d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
a7e0: 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23  def NDEBUG */..#
a7f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a800: 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  UG ./*.** Return
a810: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a820: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73  human readable s
a830: 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69  tring in a stati
a840: 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74  c buffer.** cont
a850: 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65  aining the state
a860: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
a870: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61  ject passed as a
a880: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73  n argument. This
a890: 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20  .** is intended 
a8a0: 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69  to be used withi
a8b0: 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72  n debuggers. For
a8c0: 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20   example, as an 
a8d0: 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74  alternative.** t
a8e0: 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72  o "print *pPager
a8f0: 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20  " in gdb:.**.** 
a900: 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73  (gdb) printf "%s
a910: 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  ", print_pager_s
a920: 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a  tate(pPager).*/.
a930: 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69  static char *pri
a940: 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50  nt_pager_state(P
a950: 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74  ager *p){.  stat
a960: 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32  ic char zRet[102
a970: 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  4];..  sqlite3_s
a980: 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52  nprintf(1024, zR
a990: 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e  et,.      "Filen
a9a0: 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a  ame:      %s\n".
a9b0: 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20        "State:   
a9c0: 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65        %s errCode
a9d0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f  =%d\n".      "Lo
a9e0: 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c  ck:          %s\
a9f0: 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e  n".      "Lockin
aa00: 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67  g mode:  locking
aa10: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
aa20: 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a    "Journal mode:
aa30: 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25    journal_mode=%
aa40: 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b  s\n".      "Back
aa50: 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46  ing store: tempF
aa60: 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20  ile=%d memDb=%d 
aa70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22  useJournal=%d\n"
aa80: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a  .      "Journal:
aa90: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66         journalOf
aaa0: 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64  f=%lld journalHd
aab0: 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20  r=%lld\n".      
aac0: 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20  "Size:          
aad0: 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67  dbsize=%d dbOrig
aae0: 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69  Size=%d dbFileSi
aaf0: 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c  ze=%d\n".      ,
ab00: 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20   p->zFilename.  
ab10: 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d      , p->eState=
ab20: 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20  =PAGER_OPEN     
ab30: 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20         ? "OPEN" 
ab40: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
ab50: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
ab60: 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45  R          ? "RE
ab70: 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20  ADER" :.        
ab80: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
ab90: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20  _WRITER_LOCKED  
aba0: 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45   ? "WRITER_LOCKE
abb0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
abc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
abd0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20  ITER_CACHEMOD ? 
abe0: 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  "WRITER_CACHEMOD
abf0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac10: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22  TER_DBMOD    ? "
ac20: 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a  WRITER_DBMOD" :.
ac30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
ac40: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
ac50: 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54  FINISHED ? "WRIT
ac60: 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20  ER_FINISHED" :. 
ac70: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac80: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20  ==PAGER_ERROR   
ac90: 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52          ? "ERROR
aca0: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
acb0: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72      , (int)p->er
acc0: 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d  rCode.      , p-
acd0: 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
ace0: 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f          ? "NO_LO
acf0: 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  CK" :.        p-
ad00: 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
ad10: 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52  _LOCK   ? "RESER
ad20: 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  VED" :.        p
ad30: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
ad40: 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c  VE_LOCK  ? "EXCL
ad50: 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20  USIVE" :.       
ad60: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   p->eLock==SHARE
ad70: 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48  D_LOCK     ? "SH
ad80: 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  ARED" :.        
ad90: 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  p->eLock==UNKNOW
ada0: 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b  N_LOCK    ? "UNK
adb0: 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f  NOWN" : "?error?
adc0: 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63  ".      , p->exc
add0: 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78  lusiveMode ? "ex
ade0: 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d  clusive" : "norm
adf0: 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  al".      , p->j
ae00: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae10: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
ae20: 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79  MORY   ? "memory
ae30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
ae40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
ae50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
ae60: 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a  F      ? "off" :
ae70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ae80: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ae90: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
aea0: 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a  E   ? "delete" :
aeb0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aec0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aed0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
aee0: 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20  ST  ? "persist" 
aef0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
af00: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
af10: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
af20: 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65  CATE ? "truncate
af30: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
af40: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
af50: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
af60: 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a  L      ? "wal" :
af70: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
af80: 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46   , (int)p->tempF
af90: 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d  ile, (int)p->mem
afa0: 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a  Db, (int)p->useJ
afb0: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70  ournal.      , p
afc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d  ->journalOff, p-
afd0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20  >journalHdr.    
afe0: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69    , (int)p->dbSi
aff0: 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72  ze, (int)p->dbOr
b000: 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  igSize, (int)p->
b010: 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a  dbFileSize.  );.
b020: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a  .  return zRet;.
b030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
b050: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
b060: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
b070: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
b080: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
b090: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
b0a0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
b0b0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
b0c0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
b0d0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
b0e0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
b0f0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
b100: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b110: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b120: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
b130: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
b140: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
b150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
b160: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
b170: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
b180: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
b190: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
b1a0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
b1b0: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
b1c0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
b1d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
b1e0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
b1f0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
b200: 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  *p;.  Pgno pgno 
b210: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69  = pPg->pgno;.  i
b220: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
b230: 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   i<pPager->nSave
b240: 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  point; i++){.   
b250: 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53   p = &pPager->aS
b260: 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20  avepoint[i];.   
b270: 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70   if( p->nOrig>=p
b280: 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  gno && 0==sqlite
b290: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
b2a0: 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e  InSavepoint, pgn
b2b0: 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  o) ){.      retu
b2c0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
b2d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
b2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b2f0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
b300: 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a  already in the j
b310: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
b320: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49  static int pageI
b330: 6e 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  nJournal(Pager *
b340: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
b350: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
b360: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
b370: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b380: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b390: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b3a0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b3b0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b3c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b3d0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b3e0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b3f0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b400: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b410: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b420: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b430: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b440: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b450: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b460: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b470: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b480: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b490: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b4a0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b4b0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b4c0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b4d0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b4e0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b4f0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b500: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b510: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b520: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b530: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b540: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b550: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b560: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b570: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b580: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b590: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b5a0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b5b0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b5c0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b5d0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b5e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b5f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b600: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b610: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b620: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b630: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b640: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b650: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b660: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b670: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b680: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b690: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b6a0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b6b0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b6c0: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b6d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b6e0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b6f0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b700: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b710: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b720: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b730: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b740: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b750: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b760: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b770: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b780: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b790: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b7a0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b7b0: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b7c0: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b7d0: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b7e0: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b7f0: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b800: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b810: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b820: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b830: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b840: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b850: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b860: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b870: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b880: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b890: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b8a0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b8b0: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b8c0: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b8d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b8e0: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b8f0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b900: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b910: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b920: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b930: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b940: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b960: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b970: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b980: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b990: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b9a0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b9b0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b9c0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b9d0: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
b9e0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
b9f0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
ba00: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
ba10: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
ba20: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
ba30: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
ba40: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
ba50: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
ba60: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
ba70: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
ba80: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
ba90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
baa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bab0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bac0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bad0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bae0: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
baf0: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bb00: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bb10: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bb20: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bb30: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bb40: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bb50: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bb60: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bb70: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bb80: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bb90: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bba0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
bbb0: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
bbc0: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
bbd0: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
bbe0: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bbf0: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
bc00: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
bc10: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
bc20: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
bc30: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
bc40: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
bc50: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
bc60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
bc70: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
bc80: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
bc90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
bca0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
bcb0: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
bcc0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
bcd0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
bce0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
bcf0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
bd00: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
bd10: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
bd20: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
bd30: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
bd40: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bd50: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bd60: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
bd70: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
bd80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bd90: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
bda0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
bdb0: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
bdc0: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
bdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
bde0: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
bdf0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
be00: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
be10: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
be30: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
be40: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
be50: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
be60: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
be70: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
be80: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
be90: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
bea0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
beb0: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
bec0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
bed0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bee0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
bef0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
bf00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
bf10: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
bf20: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
bf30: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
bf40: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
bf50: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bf60: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
bf70: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
bf80: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
bf90: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
bfa0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
bfb0: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
bfc0: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
bfd0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
bfe0: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
bff0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c000: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c010: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c020: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c030: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c040: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c050: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c060: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c070: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c080: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c090: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c0a0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c0b0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c0c0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c0d0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c0e0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c0f0: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c100: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c110: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c120: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c130: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c140: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c150: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c160: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c170: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c180: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1a0: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c1b0: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c1c0: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c1f0: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c200: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c230: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c240: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c250: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c280: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c290: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c2a0: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c2b0: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c2c0: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c2d0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c2e0: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c2f0: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c300: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c310: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c320: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c330: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c340: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c350: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c360: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c380: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c390: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c3a0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c3b0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c3c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
c3d0: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
c3e0: 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64  PAGES is defined
c3f0: 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65   then we do some
c400: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
c410: 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65  .** on the cache
c420: 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75   using a hash fu
c430: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73  nction.  This is
c440: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
c450: 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69  g.** and debuggi
c460: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64  ng only..*/.#ifd
c470: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
c480: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
c490: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
c4a0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
c4b0: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
c4c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
c4d0: 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42  _datahash(int nB
c4e0: 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  yte, unsigned ch
c4f0: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33  ar *pData){.  u3
c500: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
c510: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
c520: 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20  i<nByte; i++){. 
c530: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a     hash = (hash*
c540: 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d  1039) + pData[i]
c550: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68  ;.  }.  return h
c560: 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33  ash;.}.static u3
c570: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
c580: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c590: 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64    return pager_d
c5a0: 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70  atahash(pPage->p
c5b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
c5c0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
c5d0: 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b  *)pPage->pData);
c5e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
c5f0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
c600: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c610: 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61  .  pPage->pageHa
c620: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c630: 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ash(pPage);.}../
c640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
c650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
c660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
c670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
c680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
c690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
c6a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
c6b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
c6c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
c6d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
c6e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
c6f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
c700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
c710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
c720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
c730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
c740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
c750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
c760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
c770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
c780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
c790: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
c7a0: 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
c7b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
c7c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
c7d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
c7e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
c7f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
c800: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
c810: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
c820: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
c830: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
c840: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c850: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58  r_set_pagehash(X
c860: 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  ).#define CHECK_
c870: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
c880: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
c890: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
c8a0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
c8b0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
c8c0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
c8d0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
c8e0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
c8f0: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
c900: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
c910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c920: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
c930: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
c940: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
c950: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
c960: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
c970: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
c980: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
c990: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
c9a0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
c9b0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
c9c0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
c9d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9e0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
c9f0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
ca00: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
ca10: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
ca20: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
ca30: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
ca40: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
ca50: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
ca60: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
ca70: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
ca80: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
ca90: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
caa0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
cab0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
cac0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
cad0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
cae0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
caf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
cb00: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
cb10: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
cb20: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
cb30: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
cb40: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
cb50: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
cb60: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
cb70: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
cb80: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
cb90: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cbb0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
cbc0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
cbd0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
cbe0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
cbf0: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
cc00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
cc10: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
cc20: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
cc30: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
cc40: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
cc50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
cc60: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
cc70: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
cc80: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
cc90: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
cca0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ccb0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
ccc0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
ccd0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
cce0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
ccf0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
cd00: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
cd10: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
cd30: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
cd40: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cd50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
cd60: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
cd70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
cd80: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
cd90: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
cda0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
cdd0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdf0: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
ce00: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
ce10: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
ce20: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
ce30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
ce40: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
ce50: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
ce60: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
ce70: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
ce80: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
ce90: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
cea0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
ceb0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ced0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cee0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
cef0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
cf00: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
cf10: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
cf20: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
cf30: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
cf40: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
cf50: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
cf60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
cf70: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
cf80: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
cf90: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
cfa0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
cfb0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
cfc0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
cfd0: 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30  er .   || len==0
cfe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cff0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
d000: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
d010: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
d020: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d030: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
d040: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
d050: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
d060: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
d070: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
d080: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d090: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
d0b0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
d0c0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
d0d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d0e0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
d0f0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
d100: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
d110: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
d120: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
d130: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
d140: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
d150: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
d160: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
d170: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
d180: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
d190: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
d1a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
d1b0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
d1c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1d0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
d1e0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
d1f0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
d200: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
d210: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
d220: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
d230: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
d240: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d250: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
d260: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
d270: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
d280: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
d290: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d2a0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
d2b0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
d2c0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
d2d0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
d2e0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
d2f0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
d300: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
d310: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
d320: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
d330: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
d340: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
d350: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
d360: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
d370: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
d380: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
d390: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
d3a0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
d3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d3d0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d3f0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d460: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d470: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d480: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d490: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d4a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d4b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d4c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d4d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d4e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d4f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d500: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d510: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d520: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d530: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d540: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d550: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d560: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d570: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d580: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d590: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d5a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d5b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d5c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d5d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d5e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d5f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d600: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d610: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d620: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d630: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d640: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d650: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d660: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d670: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d680: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d690: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d6a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d6b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d6c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d6e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d6f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d700: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d710: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d720: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d740: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d750: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d760: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d770: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d790: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d7a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d7b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d7d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d7e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d7f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d800: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d810: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d820: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d830: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d840: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d850: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d860: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d870: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d880: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d890: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d8a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d8b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d8c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d8d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d8e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d8f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d900: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d910: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d920: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d930: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d940: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d950: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d960: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d990: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d9a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d9b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d9c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d9d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
da00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
da10: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
da20: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
da30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
da40: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
da50: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
da60: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
da70: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
da80: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
da90: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
daa0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
dab0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
dac0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
dad0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
dae0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
daf0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
db00: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
db10: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
db20: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
db30: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
db40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
db50: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
db60: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
db70: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
db80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
db90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
dba0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
dbb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
dbc0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
dbd0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
dbe0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
dbf0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
dc00: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
dc10: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dc20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
dc30: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
dc40: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
dc50: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
dc60: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
dc70: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
dc80: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
dc90: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
dca0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
dcb0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
dcc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
dcd0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
dce0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
dcf0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
dd00: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
dd10: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
dd20: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
dd30: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
dd40: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
dd50: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
dd60: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
dd70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dd80: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
dd90: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
dda0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ddb0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
ddc0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
ddd0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dde0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
ddf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
de00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
de10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
de20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
de30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
de40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
de50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
de60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
de70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
de80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
de90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
dea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
deb0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dec0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
ded0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dee0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
def0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
df00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
df10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
df20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
df30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
df40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
df50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
df60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
df70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
df80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
df90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dfa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dfc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dfd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dfe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dff0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
e000: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
e010: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
e020: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
e030: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
e040: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
e050: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
e060: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
e070: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
e080: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
e090: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
e0a0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
e0b0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
e0c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e0d0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
e0e0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e0f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e100: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
e110: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
e120: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e130: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
e140: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
e150: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
e160: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
e170: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
e180: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
e190: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
e1a0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
e1b0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
e1e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
e1f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
e200: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e220: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e230: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
e240: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
e250: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
e260: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e270: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
e280: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
e290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
e2a0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
e2b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
e2c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
e2d0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e2e0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
e2f0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
e300: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
e310: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
e320: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
e330: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
e340: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
e350: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
e360: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
e370: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
e380: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
e390: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
e3a0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
e3b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
e3c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
e3d0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
e3e0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
e3f0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e400: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e410: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e420: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e430: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e440: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e450: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e460: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e470: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e480: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e490: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e4a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e4b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e4c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e4d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e4e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e4f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e500: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e510: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e520: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e530: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e540: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e550: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e560: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e570: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e580: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e590: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e5a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e5b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e5c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e5d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e5e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e5f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e600: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e610: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e620: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e630: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e640: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e650: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e660: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e670: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e680: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e690: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e6a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e6b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e6c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e6d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e6e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e6f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e700: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e710: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e720: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e730: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e740: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e750: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e760: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e770: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e780: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e790: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e7a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e7b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e7c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e7d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e7e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e7f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e800: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e810: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e820: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e830: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e850: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e860: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e870: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e880: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e890: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e8a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e8b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e8c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e8d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e8e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e8f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e900: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e910: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e920: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e930: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e940: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e950: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e960: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e970: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e980: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e990: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e9a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e9b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e9d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e9e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e9f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  ash initializer 
ea00: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
ea10: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
ea20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ea30: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
ea40: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
ea50: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ea60: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ea70: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
ea80: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
ea90: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
eaa0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
eab0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
eac0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
ead0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
eae0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
eaf0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
eb00: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
eb10: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
eb20: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
eb30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eb40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
eb50: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
eb60: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
eb70: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
eb80: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb90: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eba0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
ebb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
ebc0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
ebd0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
ebe0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
ebf0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
ec00: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
ec10: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
ec20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
ec30: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
ec40: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
ec50: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
ec60: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
ec70: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
ec80: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
ec90: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
eca0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
ecb0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
ecc0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
ecd0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
ece0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
ecf0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
ed00: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
ed10: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
ed20: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
ed30: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
ed40: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
ed50: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
ed60: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
ed70: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
ed80: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
ed90: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
eda0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
edb0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
edc0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
edd0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
ede0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
edf0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ee00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ee10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ee20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ee30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ee40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ee50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ee60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ee70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ee80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ee90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eea0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eeb0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eec0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
eed0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eee0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eef0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
ef00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
ef10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
ef20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
ef30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
ef40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
ef50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
ef60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
ef70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
ef80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ef90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
efa0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
efb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
efc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
efd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
efe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
eff0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
f000: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
f010: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
f020: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
f030: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
f040: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
f050: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
f060: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
f070: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
f080: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
f090: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
f0a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
f0b0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
f0c0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
f0d0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
f0e0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
f0f0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
f100: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
f110: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
f120: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
f130: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
f140: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
f150: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
f160: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
f170: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
f180: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
f190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
f1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f1b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
f1c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f1d0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
f1e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
f1f0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
f200: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f210: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
f220: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
f230: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
f240: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
f250: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
f260: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
f270: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
f280: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
f290: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f2a0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
f2b0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
f2c0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
f2d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
f2e0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
f2f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
f300: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
f310: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
f320: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
f330: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
f340: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
f350: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
f360: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
f370: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
f380: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
f390: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
f3a0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
f3b0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
f3c0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
f3d0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
f3e0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
f3f0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f400: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f410: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f420: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f430: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f440: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f450: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f460: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f470: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f480: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f490: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f4a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f4b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f4c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f4d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f4e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f4f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f500: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f510: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f520: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f530: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f540: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f550: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f560: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f570: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f580: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f590: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f5a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f5b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f5c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f5d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f5e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f5f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f600: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f610: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f620: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f640: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f650: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f660: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f670: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f680: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f690: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f6a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f6b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f6c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f6d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f6e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f6f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f700: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f710: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f720: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f730: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f750: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f760: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f770: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f780: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f790: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f7a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f7b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f7c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f7d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f7e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f7f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f800: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f810: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f820: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f830: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f840: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f850: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f870: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f880: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f890: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f8a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f8c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f8d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f8e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f8f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f900: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f920: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f930: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f940: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f950: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f960: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f970: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f980: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f990: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f9a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f9b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f9c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f9d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f9e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f9f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
fa00: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
fa10: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
fa20: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
fa30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
fa40: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
fa50: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
fa60: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
fa70: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
fa80: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
fa90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
faa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fab0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
fac0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
fad0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
fae0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fb10: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
fb20: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
fb30: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
fb40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
fb50: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
fb60: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
fb70: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
fb80: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
fb90: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
fba0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
fbb0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
fbc0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
fbd0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
fbe0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
fbf0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fc00: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
fc10: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fc20: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
fc30: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc40: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc60: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
fc70: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
fc80: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
fc90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fca0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fcb0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
fcc0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
fcd0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
fce0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fcf0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
fd00: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fd20: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
fd30: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
fd40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
fd50: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
fd60: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
fd70: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
fd80: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
fd90: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
fda0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
fdb0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
fdc0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
fdd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
fde0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdf0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fe10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fe20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fe30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fe40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fe50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fe60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fe70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fe80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fe90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
fea0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
feb0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fec0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fed0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fee0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fef0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
ff00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
ff10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
ff20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
ff30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
ff40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
ff50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
ff60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
ff70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
ff80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
ff90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
ffa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
ffb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
ffc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
ffd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
ffe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fff0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
10000 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
10010 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
10020 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
10030 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
10040 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
10050 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
10060 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
10070 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10080 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
10090 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
100a0 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
100b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
100c0 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
100f0 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
10100 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
10110 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
10120 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
10130 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
10140 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
10150 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
10160 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
10170 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
10180 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
10190 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
101a0 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
101b0 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
101c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
101d0 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
101e0 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
101f0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10200 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
10210 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
10220 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
10230 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
10240 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
10250 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
10260 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
10270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
10280 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
10290 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
102a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
102b0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
102c0 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
102d0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
102e0 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
102f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
10300 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
10310 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
10320 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
10330 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
10340 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
10350 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10360 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
10370 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10380 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
10390 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
103a0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
103b0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
103c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
103d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
103e0 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
103f0 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10400 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10410 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10420 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10430 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10440 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10450 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10460 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10470 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10480 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10490 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
104a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
104b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
104c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
104d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
104e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
104f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10500 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10510 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10520 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10530 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10540 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10560 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10570 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10590 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
105a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
105b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
105c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
105d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
105e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
105f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10600 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10610 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10620 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10630 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10650 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10660 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10670 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10680 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10690 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
106a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
106b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
106c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
106d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
106e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
106f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10700 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10710 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10720 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10730 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10740 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10750 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10760 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10770 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10780 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10790 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
107b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
107c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
107d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
107e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
107f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10800 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10810 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10820 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10830 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10840 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10850 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10860 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10870 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10880 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10890 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
108a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
108b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
108c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
108d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
108e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
108f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10900 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10910 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10920 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10940 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10950 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10970 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10980 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10990 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
109a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
109b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
109c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
109d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
109e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10a10 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10a20 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10a30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10a40 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10a50 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10a60 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10a70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10a80 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10a90 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
10aa0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
10ab0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10ac0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10ad0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10ae0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10af0 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70 65  RY .   || !isOpe
10b00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a 20  n(pPager->jfd). 
10b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
10b30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
10b40 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
10b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10b60 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
10b70 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
10b80 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
10b90 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
10ba0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
10bb0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10bc0 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10bd0 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10be0 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10bf0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10c00 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10c10 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10c20 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10c30 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10c40 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10c50 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10c60 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10c70 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10c80 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10c90 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ca0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10cb0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10cc0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10cd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10ce0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10cf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10d00 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10d10 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10d20 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10d30 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10d40 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10d50 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10d60 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10d70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10d80 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10d90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10da0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10db0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10dc0 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10dd0 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10de0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10df0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10e00 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10e10 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10e20 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10e30 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10e40 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10e50 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10e60 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10e70 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10e80 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10e90 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ea0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10eb0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ec0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10ed0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10ee0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10ef0 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10f00 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10f10 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10f20 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10f30 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10f40 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10f50 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10f60 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10f80 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10f90 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10fa0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10fb0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10fc0 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10fd0 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10fe0 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10ff0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
11000 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11010 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
11020 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
11030 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
11040 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
11050 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
11060 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
11070 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
11080 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
11090 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
110a0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
110b0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
110c0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
110d0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
110e0 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
110f0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
11100 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
11110 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
11120 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
11130 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
11140 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
11150 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
11160 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
11170 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
11180 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
11190 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
111a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
111b0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
111c0 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
111d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
111e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
111f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11200 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11210 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11220 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11230 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
11240 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
11250 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  nts of the in-me
11260 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68 65 2e  mory page-cache.
11270 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11280 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
11290 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
112a0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
112b0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
112c0 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  up);.  sqlite3Pc
112d0 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
112e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
112f0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11300 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
11310 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11320 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
11330 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
11340 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
11350 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
11360 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11370 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11380 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11390 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
113a0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
113b0 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
113c0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
113d0 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
113e0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
113f0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11400 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11410 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11420 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11430 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
11440 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
11450 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11460 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11470 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11480 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11490 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
114a0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
114b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
114c0 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
114d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
114e0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
114f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11500 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11510 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11520 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11530 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11540 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11550 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11560 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11570 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11580 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11590 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
115a0 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
115b0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
115c0 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
115d0 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
115e0 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
115f0 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11600 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11610 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11620 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11630 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11640 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11650 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11660 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11670 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11690 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
116a0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
116b0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
116c0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
116d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
116e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
116f0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11700 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11710 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11720 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11730 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11740 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11750 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11760 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11770 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11780 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
117a0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
117b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
117c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
117d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
117e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
117f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11800 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11810 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11820 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11830 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11840 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11850 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11860 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11870 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11880 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11890 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
118a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
118b0 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
118c0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
118d0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
118e0 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
118f0 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11900 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11910 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11920 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11930 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11940 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11950 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11960 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11970 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11980 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11990 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
119a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
119b0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
119c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
119d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
119e0 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
119f0 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11a00 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11a10 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11a20 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11a30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11a40 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11a50 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11a60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11a70 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11a80 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11a90 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11aa0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11ab0 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11ac0 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11ad0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11ae0 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11af0 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11b00 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11b10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11b20 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11b30 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11b40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11b50 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11b60 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11b70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11b80 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11b90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11ba0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11bb0 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11bc0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11bd0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11be0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11bf0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11c00 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11c10 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11c20 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11c30 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
11c40 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
11c50 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
11c60 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
11c70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
11c80 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
11c90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11ca0 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11cb0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11cc0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11cd0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11d00 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11d10 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11d20 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11d30 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11d40 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
11d50 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11d60 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
11d70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11d80 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11d90 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11da0 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11db0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11dc0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11dd0 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11de0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11df0 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11e00 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11e10 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11e20 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11e30 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11e40 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11e50 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11e60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
11e70 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11e80 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
11e90 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11ea0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11eb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
11ec0 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11ed0 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11ee0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
11ef0 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
11f00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11f10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11f20 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
11f30 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11f40 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11f50 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
11f60 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
11f70 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11f80 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
11f90 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
11fa0 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
11fb0 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
11fc0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
11fd0 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
11fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
11ff0 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12000 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12010 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
12020 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12030 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12040 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
12050 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
12060 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12070 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12080 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12090 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
120a0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
120b0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
120c0 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
120d0 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
120e0 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
120f0 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12100 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
12110 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
12120 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
12130 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
12140 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
12150 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12160 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12170 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12180 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12190 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
121a0 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
121b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
121c0 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
121d0 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
121e0 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
121f0 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12200 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
12210 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
12220 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
12230 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
12240 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
12250 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
12260 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12270 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12280 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12290 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
122a0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
122b0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
122c0 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
122d0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
122e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
122f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12300 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12310 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12320 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12330 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12340 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
12350 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
12360 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12370 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12380 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12390 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
123a0 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
123b0 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
123c0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
123d0 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
123e0 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
123f0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12400 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12410 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
12420 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
12430 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
12440 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
12450 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
12460 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12470 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12480 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12490 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
124a0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
124b0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
124c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
124d0 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
124e0 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
124f0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12500 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
12530 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
12540 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
12550 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
12560 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12570 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12580 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12590 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
125a0 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
125b0 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
125c0 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
125d0 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
125e0 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
125f0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12600 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
12610 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
12620 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
12630 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
12640 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
12650 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
12660 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12670 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12680 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12690 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
126a0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
126b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
126c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
126d0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
126e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
126f0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12700 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
12710 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
12720 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
12730 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
12740 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
12750 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
12760 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12770 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12780 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12790 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
127a0 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
127b0 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
127c0 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
127d0 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
127e0 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
127f0 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12800 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
12810 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12820 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
12830 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
12840 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
12850 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
12860 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12870 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12880 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12890 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
128a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
128b0 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
128c0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
128d0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
128e0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
128f0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12900 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12910 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12920 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12940 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12950 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12970 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12980 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12990 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
129a0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
129b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
129c0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
129d0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
129e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
129f0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12a00 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12a10 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12a20 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12a40 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12a50 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12a60 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12a70 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12a80 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12a90 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12aa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12ab0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12ac0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12ad0 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12ae0 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12af0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12b00 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12b10 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12b20 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12b30 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12b40 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12b50 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12b60 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12b70 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12b80 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12b90 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12ba0 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
12bb0 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
12bc0 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
12bd0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12be0 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
12bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12c00 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
12c10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
12c20 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
12c30 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
12c40 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
12c50 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
12c60 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
12c70 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
12c80 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
12c90 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
12ca0 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
12cb0 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
12cc0 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
12cd0 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
12ce0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12cf0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12d00 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12d10 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
12d20 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
12d30 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
12d40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12d50 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
12d60 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
12d70 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
12d80 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
12d90 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
12da0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12db0 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
12dc0 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
12dd0 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
12de0 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
12df0 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
12e00 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
12e10 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
12e20 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12e30 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
12e40 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
12e50 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
12e60 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
12e70 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
12e80 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
12e90 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
12ea0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
12eb0 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
12ec0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
12ed0 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
12ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
12ef0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
12f00 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
12f10 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12f20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
12f30 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
12f40 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
12f50 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
12f60 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
12f70 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
12f80 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
12f90 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
12fa0 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
12fb0 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12fc0 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
12fd0 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
12fe0 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
12ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13000 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
13010 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
13020 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
13030 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
13040 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
13050 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
13060 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13070 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13080 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13090 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
130a0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
130b0 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
130c0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
130d0 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
130e0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
130f0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13100 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
13110 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13120 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
13130 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
13140 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
13150 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
13160 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13170 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13180 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13190 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
131a0 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
131b0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
131c0 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
131d0 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
131e0 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
131f0 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13200 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
13210 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
13220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
13230 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
13240 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
13250 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
13260 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13270 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13280 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13290 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
132a0 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
132b0 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
132c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
132d0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
132e0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
132f0 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13300 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
13310 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
13320 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
13330 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13340 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
13350 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
13360 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13370 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13380 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13390 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
133a0 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
133b0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
133c0 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
133d0 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
133e0 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
133f0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13400 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
13410 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
13420 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
13430 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
13440 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
13450 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
13460 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13470 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13480 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13490 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
134a0 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
134b0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
134c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
134d0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
134e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
134f0 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13500 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
13510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13520 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
13530 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
13540 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
13550 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
13560 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13570 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13580 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13590 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
135a0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
135b0 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
135c0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
135d0 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
135e0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
135f0 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13600 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
13610 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
13620 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
13630 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
13640 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13650 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
13660 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13670 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13680 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13690 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
136a0 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
136b0 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
136c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
136d0 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
136e0 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
136f0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13700 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
13710 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
13720 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
13730 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
13740 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
13750 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
13760 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13770 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13780 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13790 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
137a0 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
137b0 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
137c0 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
137d0 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
137e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
137f0 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13800 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
13810 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13820 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
13830 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
13840 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
13850 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
13860 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13870 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
138a0 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
138b0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
138c0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
138d0 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
138e0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
138f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13900 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13910 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13920 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13930 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13940 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13950 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13960 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13970 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13980 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13990 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
139a0 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
139b0 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
139c0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
139d0 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
139e0 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
139f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
13a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13a10 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13a20 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13a30 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
13a40 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13a50 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
13a60 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13a70 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a80 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a90 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
13aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13ab0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
13ac0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13ad0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
13ae0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13af0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13b00 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
13b10 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13b20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13b30 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13b40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13b50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13b60 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
13b70 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
13b80 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
13b90 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
13ba0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
13bb0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13bc0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
13bd0 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
13be0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
13bf0 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
13c00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13c10 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13c20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
13c30 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
13c40 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
13c50 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
13c60 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
13c70 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
13c80 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
13c90 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
13ca0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
13cb0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
13cc0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
13cd0 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
13ce0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
13cf0 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
13d00 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
13d10 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
13d20 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
13d30 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
13d40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13d50 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
13d60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13d70 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
13d80 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
13d90 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
13da0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13db0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13dc0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
13dd0 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
13de0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
13df0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13e00 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13e10 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13e20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13e30 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13e40 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
13e50 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13e60 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13e70 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
13e80 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
13e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13ea0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
13eb0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
13ec0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
13ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13ee0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13ef0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
13f00 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
13f10 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
13f20 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
13f30 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
13f40 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
13f50 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
13f60 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
13f70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
13f80 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
13f90 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
13fa0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13fb0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fc0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fe0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
13ff0 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14000 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
14010 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
14020 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
14030 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14040 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
14050 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
14060 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
14070 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
14080 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
14090 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
140a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
140b0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
140c0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
140d0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
140e0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
140f0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14100 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14110 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14120 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14130 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14140 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14150 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14160 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
14170 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
14180 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14190 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
141a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
141b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
141c0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
141d0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
141e0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
141f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14200 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14210 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14220 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14230 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14240 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14250 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14260 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
14270 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
14280 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
14290 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
142a0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
142b0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
142c0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
142d0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
142e0 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
142f0 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14300 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14310 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14320 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14330 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14340 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14350 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14360 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
14370 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
14380 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
14390 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
143a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
143b0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
143c0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
143d0 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
143e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
143f0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14400 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14410 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14420 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14430 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14450 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
14460 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
14470 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14480 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
14490 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
144a0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
144b0 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
144c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
144d0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
144e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
144f0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14500 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
14510 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
14520 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
14530 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
14540 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14550 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14560 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
14570 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
14580 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
14590 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
145a0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
145b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
145c0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
145d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
145e0 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
145f0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
14600 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
14610 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
14620 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
14630 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14640 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14650 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14660 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
14670 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
14680 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
14690 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
146a0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
146b0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
146c0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
146d0 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
146e0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
146f0 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14700 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14710 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14720 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14730 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14740 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14750 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14760 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14770 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14780 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14790 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
147a0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
147b0 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
147c0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
147d0 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
147e0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
147f0 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14800 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14810 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14820 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14830 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14840 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14850 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14860 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14870 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14880 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14890 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
148a0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
148b0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
148c0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
148d0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
148e0 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
148f0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14900 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14910 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14920 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14930 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14940 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14950 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14960 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14970 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14980 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14990 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
149a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
149b0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
149c0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
149d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
149e0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
149f0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14a00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14a10 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14a20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14a30 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14a50 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14a60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14a70 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14a80 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14a90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14aa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14ab0 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14ac0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14ad0 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14af0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14b00 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14b10 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14b20 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14b30 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14b40 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14b50 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14b60 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14b70 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14b80 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14b90 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14ba0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14bb0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14bc0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14bd0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14be0 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14bf0 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14c00 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14c10 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14c20 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14c30 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14c40 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14c50 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14c60 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14c70 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14c80 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14c90 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14ca0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14cb0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14cc0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14cd0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14ce0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14cf0 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14d00 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
14d10 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
14d20 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
14d30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14d40 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
14d50 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
14d60 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
14d70 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
14d80 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
14d90 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
14da0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
14db0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14dc0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14dd0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14de0 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14df0 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14e00 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
14e10 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
14e20 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
14e30 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
14e40 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
14e50 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
14e60 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
14e70 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
14e80 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
14e90 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
14ea0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
14eb0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14ec0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14ed0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14ee0 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14ef0 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14f00 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
14f10 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
14f20 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
14f30 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
14f40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14f50 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
14f60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
14f70 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
14f80 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
14f90 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
14fa0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
14fb0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14fc0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14fd0 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14fe0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14ff0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15000 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15010 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15020 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15030 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15040 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15050 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15060 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
15070 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
15080 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
15090 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
150a0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
150b0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
150e0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
150f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15100 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15110 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15120 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15130 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15150 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15160 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
15170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
15180 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
15190 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
151a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
151b0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
151c0 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
151d0 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
151e0 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
151f0 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
15200 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
15210 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
15220 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
15230 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15240 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15250 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15260 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
15270 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
15280 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
15290 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
152a0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
152b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
152c0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
152d0 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
152e0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
152f0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15300 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
15310 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
15320 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
15330 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
15340 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15350 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15360 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
15370 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
15380 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
15390 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
153a0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
153b0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
153c0 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
153d0 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
153e0 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
153f0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15400 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
15410 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
15420 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
15430 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
15440 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15450 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15460 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
15470 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
15480 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
15490 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
154a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
154b0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
154c0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
154d0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
154e0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
154f0 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
15500 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
15510 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
15520 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15530 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
15540 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15550 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15560 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
15570 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
15580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15590 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
155a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
155b0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
155c0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
155d0 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
155e0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
155f0 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
15600 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
15610 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
15620 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
15630 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
15640 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15650 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15660 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
15670 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
15680 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
15690 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
156a0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
156b0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
156c0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
156d0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
156e0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
156f0 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15700 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15710 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15720 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15730 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15740 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15750 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15760 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15770 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15780 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15790 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
157a0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
157b0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
157c0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
157d0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
157e0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
157f0 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15800 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15810 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15820 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15830 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15840 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15850 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15860 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15880 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15890 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
158a0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
158b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
158d0 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
158e0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
158f0 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15900 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15910 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15920 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15930 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15950 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15960 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15970 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15980 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15990 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
159a0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
159b0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
159c0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
159d0 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
159f0 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15a00 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15a10 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a30 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15a40 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15a50 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15a60 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15a70 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15a80 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15a90 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15aa0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ac0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15ad0 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15ae0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15af0 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15b00 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15b10 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15b30 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15b40 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15b50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15b60 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15b70 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15b80 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15b90 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15ba0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15bb0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15bc0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15bd0 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15be0 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15bf0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15c00 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15c10 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15c20 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15c30 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15c40 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15c50 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15c60 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15c70 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15c80 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15c90 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15ca0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15cb0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15cc0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15cd0 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15ce0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15cf0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15d00 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
15d10 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
15d20 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
15d30 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
15d40 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
15d50 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
15d60 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
15d70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
15d80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
15d90 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
15da0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
15db0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15dc0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15dd0 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15de0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15df0 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15e00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15e10 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
15e20 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
15e30 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
15e40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15e50 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
15e60 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
15e70 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
15e80 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
15e90 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
15ea0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
15eb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15ec0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15ed0 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15ee0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15ef0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15f00 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
15f10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
15f20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15f30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15f40 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15f50 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
15f60 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
15f70 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
15f80 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
15f90 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
15fa0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
15fb0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15fc0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15fd0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15fe0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15ff0 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16000 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16010 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16020 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16030 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16040 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16050 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16060 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
16070 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
16080 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
16090 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
160a0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
160b0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
160c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
160d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
160e0 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
160f0 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16100 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16110 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16120 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16130 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16140 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16150 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16160 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
16170 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
16180 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
16190 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
161a0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
161b0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
161c0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
161d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
161e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
161f0 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
16200 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
16210 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
16220 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
16230 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
16240 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16250 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16260 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
16270 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
16280 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
16290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
162a0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
162b0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
162c0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
162d0 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
162e0 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
162f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
16310 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
16320 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16330 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
16340 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16350 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16360 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
16370 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
16380 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
16390 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
163a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
163b0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
163c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
163d0 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
163e0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
163f0 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
16400 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
16410 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
16420 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
16430 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
16440 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
16450 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
16460 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
16470 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
16480 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16490 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
164a0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
164b0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
164c0 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
164d0 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
164e0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
164f0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
16500 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
16510 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
16520 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
16530 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
16540 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16550 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
16560 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
16570 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
16580 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
16590 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
165a0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
165b0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
165c0 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
165d0 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
165e0 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
165f0 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
16600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16610 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
16620 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
16630 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16640 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
16650 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
16660 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
16670 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
16680 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
16690 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
166a0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
166b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
166c0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
166d0 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
166e0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
166f0 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16700 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16710 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16720 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16730 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16740 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16750 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
16760 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
16770 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
16780 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
16790 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
167a0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
167b0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
167c0 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
167d0 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
167e0 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
167f0 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16800 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16810 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16820 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16830 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16840 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16850 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
16860 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
16870 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
16880 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
16890 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
168a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
168b0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
168c0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
168d0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
168e0 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
168f0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16900 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
16910 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
16920 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
16930 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
16940 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16950 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
16960 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
16970 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
16980 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16990 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
169a0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
169b0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
169c0 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
169d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
169e0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
169f0 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16a00 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16a10 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16a20 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16a30 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16a40 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16a50 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
16a60 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
16a70 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
16a80 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
16a90 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
16aa0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
16ab0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16ac0 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16ad0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16ae0 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16af0 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16b00 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16b10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16b20 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16b30 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16b40 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16b50 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
16b60 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
16b70 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
16b80 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
16b90 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
16ba0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
16bb0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16bd0 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16be0 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16bf0 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16c00 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16c10 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16c20 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16c30 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16c40 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16c50 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
16c60 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
16c70 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
16c80 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
16c90 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
16ca0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
16cb0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16cc0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16cd0 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16ce0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16cf0 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16d00 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
16d10 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
16d20 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
16d30 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
16d40 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
16d50 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
16d60 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
16d70 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
16d80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
16d90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
16da0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
16db0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16dc0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
16dd0 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  Lookup(pPager, p
16de0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  gno);.  }.  asse
16df0 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44  rt( pPg || !MEMD
16e00 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
16e10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16e20 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67  AGER_OPEN || pPg
16e30 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  ==0 );.  PAGERTR
16e40 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25  ACE(("PLAYBACK %
16e50 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
16e60 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20  08x) %s\n",.    
16e70 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
16e80 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
16e90 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
16ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
16eb0 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20  u8*)aData),.    
16ec0 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72         (isMainJr
16ed0 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c  nl?"main-journal
16ee0 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29  ":"sub-journal")
16ef0 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d  .  ));.  if( isM
16f00 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69  ainJrnl ){.    i
16f10 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  sSynced = pPager
16f20 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f  ->noSync || (*pO
16f30 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d  ffset <= pPager-
16f40 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
16f50 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e  }else{.    isSyn
16f60 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c  ced = (pPg==0 ||
16f70 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20   0==(pPg->flags 
16f80 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
16f90 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  C));.  }.  if( i
16fa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
16fb0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
16fc0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
16fd0 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
16fe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16ff0 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26  AGER_OPEN).   &&
17000 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20   isSynced.  ){. 
17010 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70     i64 ofst = (p
17020 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
17030 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
17040 20 20 74 65 73 74 63 61 73 65 28 20 21 69 73 53    testcase( !isS
17050 61 76 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30  avepnt && pPg!=0
17060 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
17070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17080 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
17090 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
170a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
170b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
170c0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  te(pPager->fd, (
170d0 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67  u8 *)aData, pPag
170e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
170f0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  st);.    if( pgn
17100 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
17110 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
17120 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17130 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
17140 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17150 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20  Backup ){.      
17160 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
17170 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
17180 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  c=SQLITE_NOMEM);
17190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
171a0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
171b0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
171c0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
171d0 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
171e0 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
171f0 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
17200 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20  MEM, aData);.   
17210 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
17220 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50  isMainJrnl && pP
17230 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  g==0 ){.    /* I
17240 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c  f this is a roll
17250 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f  back of a savepo
17260 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77 61 73  int and data was
17270 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a   not written to.
17280 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
17290 61 73 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  ase and the page
172a0 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72   is not in-memor
172b0 79 2c 20 74 68 65 72 65 20 69 73 20 61 20 70 6f  y, there is a po
172c0 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70  tential.    ** p
172d0 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65  roblem. When the
172e0 20 70 61 67 65 20 69 73 20 6e 65 78 74 20 66 65   page is next fe
172f0 74 63 68 65 64 20 62 79 20 74 68 65 20 62 2d 74  tched by the b-t
17300 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20  ree layer, it . 
17310 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65     ** will be re
17320 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
17330 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
17340 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
17350 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  be .    ** curre
17360 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nt. .    **.    
17370 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61 20 63  ** There are a c
17380 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65  ouple of differe
17390 6e 74 20 77 61 79 73 20 74 68 69 73 20 63 61 6e  nt ways this can
173a0 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65   happen. All are
173b0 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62   quite.    ** ob
173c0 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e  scure. When runn
173d0 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ing in synchrono
173e0 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61  us mode, this ca
173f0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20  n only happen . 
17400 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67     ** if the pag
17410 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65  e is on the free
17420 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73 74 61  -list at the sta
17430 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17440 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20  ction, then.    
17450 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68  ** populated, th
17460 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73  en moved using s
17470 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
17480 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  age()..    **.  
17490 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
174a0 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69  n is to add an i
174b0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f  n-memory page to
174c0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
174d0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ining.    ** the
174e0 20 64 61 74 61 20 6a 75 73 74 20 72 65 61 64 20   data just read 
174f0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
17500 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70  rnal. Mark the p
17510 61 67 65 20 61 73 20 64 69 72 74 79 20 0a 20 20  age as dirty .  
17520 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20    ** and if the 
17530 70 61 67 65 72 20 72 65 71 75 69 72 65 73 20 61  pager requires a
17540 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74   journal-sync, t
17550 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  hen mark the pag
17560 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71  e as .    ** req
17570 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  uiring a journal
17580 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20  -sync before it 
17590 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  is written..    
175a0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
175b0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
175c0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
175d0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
175e0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
175f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )==0 );.    pPag
17600 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
17610 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  = SPILLFLAG_ROLL
17620 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73  BACK;.    rc = s
17630 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
17640 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
17650 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
17660 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
17670 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
17680 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
17690 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
176a0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
176b0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
176c0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
176d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
176e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67  turn rc;.    pPg
176f0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
17700 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
17710 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
17720 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
17730 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
17740 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
17750 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
17760 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
17770 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
17780 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
17790 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
177a0 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
177b0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
177c0 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
177d0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
177e0 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
177f0 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
17800 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
17810 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
17820 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
17830 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
17840 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
17850 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
17860 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
17870 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
17880 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
17890 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70  a;.    pData = p
178a0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d  Pg->pData;.    m
178b0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38  emcpy(pData, (u8
178c0 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
178d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
178e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
178f0 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  r(pPg);.    if( 
17900 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21  isMainJrnl && (!
17910 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f  isSavepnt || *pO
17920 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a  ffset<=pPager->j
17930 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20  ournalHdr) ){.  
17940 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
17950 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
17960 61 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65  age were just re
17970 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20  stored from the 
17980 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a  main .      ** j
17990 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
179a0 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75  n its content mu
179b0 73 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65  st be as they we
179c0 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20  re when the .   
179d0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
179e0 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  n was first open
179f0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
17a00 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65   we can mark the
17a10 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61   page.      ** a
17a20 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74  s clean, since t
17a30 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20  here will be no 
17a40 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74  need to write it
17a50 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20   out to the.    
17a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
17a70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
17a80 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78   There is one ex
17a90 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  ception to this 
17aa0 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  rule. If the pag
17ab0 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
17ac0 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
17ad0 61 73 20 70 61 72 74 20 6f 66 20 61 20 73 61 76  as part of a sav
17ae0 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65  epoint (or state
17af0 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66  ment) rollback f
17b00 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a  rom an .      **
17b10 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
17b20 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  n of the main jo
17b30 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
17b40 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a   it is not safe.
17b50 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b        ** to mark
17b60 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
17b70 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  an. This is beca
17b80 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20  use marking the 
17b90 70 61 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a  page as.      **
17ba0 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61   clean will clea
17bb0 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
17bc0 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63  _SYNC flag. Sinc
17bd0 65 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  e the page is.  
17be0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69      ** already i
17bf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
17c00 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20  le (recorded in 
17c10 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
17c20 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  ) and.      ** t
17c30 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
17c40 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  NC flag is clear
17c50 65 64 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ed, if the page 
17c60 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  is written to.  
17c70 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
17c80 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
17c90 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
17ca0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
17cb0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   but.      ** th
17cc0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17cd0 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20  C flag will not 
17ce0 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64  be set. It could
17cf0 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c   then potentiall
17d00 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72  y.      ** be wr
17d10 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74  itten out into t
17d20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17d30 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72   before its jour
17d40 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  nal file.      *
17d50 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e  * segment is syn
17d60 63 65 64 2e 20 49 66 20 61 20 63 72 61 73 68 20  ced. If a crash 
17d70 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72  occurs during or
17d80 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c   following this,
17d90 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17da0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  se corruption ma
17db0 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a  y ensue..      *
17dc0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
17dd0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17de0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ger) );.      sq
17df0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
17e00 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
17e10 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
17e20 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20  agehash(pPg);.. 
17e30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
17e40 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
17e50 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
17e60 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
17e70 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
17e80 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
17e90 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
17ea0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
17eb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
17ec0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17ed0 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
17ee0 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
17ef0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
17f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
17f10 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
17f20 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
17f30 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
17f40 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
17f50 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
17f60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  =SQLITE_NOMEM);.
17f70 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17f80 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
17f90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
17fb0 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68  er zMaster is th
17fc0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
17fd0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
17fe0 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   A single journa
17ff0 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72  l.** file that r
18000 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d  eferred to the m
18010 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18020 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  le has just been
18030 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
18040 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
18050 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f  ecks if it is po
18060 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
18070 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18080 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64  nal file,.** and
18090 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69   does so if it i
180a0 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  s..**.** Argumen
180b0 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f  t zMaster may po
180c0 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d  int to Pager.pTm
180d0 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20  pSpace. So that 
180e0 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a  buffer is not .*
180f0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
18100 75 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  use within this 
18110 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
18120 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f  When a master jo
18130 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72  urnal file is cr
18140 65 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70  eated, it is pop
18150 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ulated with the 
18160 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c  names .** of all
18170 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f   of its child jo
18180 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65  urnals, one afte
18190 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61  r another, forma
181a0 74 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a  tted as utf-8 .*
181b0 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20  * encoded text. 
181c0 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20  The end of each 
181d0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69  child journal fi
181e0 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74  le is marked wit
181f0 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  h a .** nul-term
18200 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30  inator byte (0x0
18210 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74  0). i.e. the ent
18220 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
18230 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
18240 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74  .** file for a t
18250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c  ransaction invol
18260 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73  ving two databas
18270 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a  es might be:.**.
18280 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c  **   "/home/bill
18290 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /a.db-journal\x0
182a0 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62  0/home/bill/b.db
182b0 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a  -journal\x00".**
182c0 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75  .** A master jou
182d0 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e  rnal file may on
182e0 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e  ly be deleted on
182f0 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  ce all of its ch
18300 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73  ild .** journals
18310 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65   have been rolle
18320 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  d back..**.** Th
18330 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64  is function read
18340 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
18350 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
18360 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a  rnal file into .
18370 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f  ** memory and lo
18380 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68  ops through each
18390 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f   of the child jo
183a0 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72  urnal names. For
183b0 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a  .** each child j
183c0 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b  ournal, it check
183d0 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  s if:.**.**   * 
183e0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
183f0 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64  rnal exists, and
18400 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66   if so.**   * if
18410 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
18420 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65  al contains a re
18430 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65  ference to maste
18440 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  r journal .**   
18450 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a    file zMaster.*
18460 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20  *.** If a child 
18470 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
18480 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65  ound that matche
18490 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72  s both of the cr
184a0 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c  iteria.** above,
184b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
184c0 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64  eturns without d
184d0 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f  oing anything. O
184e0 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20  therwise, if.** 
184f0 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f  no such child jo
18500 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18510 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72  nd, file zMaster
18520 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   is deleted from
18530 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
18540 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65  tem using sqlite
18550 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
18560 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
18570 72 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  r within this fu
18580 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72  nction, an error
18590 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
185a0 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
185b0 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65  ion allocates me
185c0 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20  mory by calling 
185d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e  sqlite3Malloc().
185e0 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   If an allocatio
185f0 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49  n.** fails, SQLI
18600 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
18610 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
18620 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c   if no IO or mal
18630 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f  loc errors .** o
18640 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ccur, SQLITE_OK 
18650 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
18660 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75  ** TODO: This fu
18670 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73  nction allocates
18680 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20   a single block 
18690 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61  of memory to loa
186a0 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  d.** the entire 
186b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
186c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
186d0 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20  ile. This could 
186e0 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f  be.** a couple o
186f0 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73  f kilobytes or s
18700 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  o - potentially 
18710 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
18720 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a  page .** size..*
18730 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18740 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67  er_delmaster(Pag
18750 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
18760 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
18770 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
18780 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
18790 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
187c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
187d0 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20  le *pMaster;    
187e0 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74  /* Malloc'd mast
187f0 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
18800 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
18810 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
18820 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c  ournal;   /* Mal
18830 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72  loc'd child-jour
18840 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
18850 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tor */.  char *z
18860 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
18870 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
18880 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
18890 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
188a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
188b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
188c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
188d0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
188e0 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
188f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
18900 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74   one journal wit
18910 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20  hin MJ file */. 
18920 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
18930 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  r;         /* Sp
18940 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66  ace to hold MJ f
18950 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a  ilename from a j
18960 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18970 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b   int nMasterPtr;
18980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d             /* Am
18990 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c  ount of space al
189a0 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74  located to zMast
189b0 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a  erPtr[] */..  /*
189c0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
189d0 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f  for both the pJo
189e0 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65  urnal and pMaste
189f0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
18a00 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63  rs..  ** If succ
18a10 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65  essful, open the
18a20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18a30 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
18a40 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
18a50 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18a60 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
18a70 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46  Zero(pVfs->szOsF
18a80 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
18a90 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
18aa0 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
18ab0 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
18ac0 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
18ad0 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
18ae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18af0 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
18b00 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
18b10 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
18b20 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
18b30 43 54 49 4f 4e 0a 20 20 20 20 20 20 28 70 50 61  CTION.      (pPa
18b40 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51  ger->vfsFlags&SQ
18b50 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52  LITE_OPEN_FILEPR
18b60 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a  OTECTION_MASK)|.
18b70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 28 53 51  #endif.      (SQ
18b80 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18b90 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
18ba0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
18bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18bc0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
18bd0 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
18be0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
18bf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18c00 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18c10 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
18c20 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
18c30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18c40 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
18c50 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
18c60 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
18c70 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
18c80 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
18c90 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
18ca0 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
18cb0 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
18cc0 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
18cd0 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
18ce0 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
18cf0 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
18d00 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
18d10 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
18d20 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
18d30 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
18d40 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
18d50 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
18d60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18d70 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18d80 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
18d90 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
18da0 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
18db0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
18dc0 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73  Malloc((int)nMas
18dd0 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61  terJournal + nMa
18de0 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20  sterPtr + 1);.  
18df0 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
18e00 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nal ){.    rc = 
18e10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18e20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18e30 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  _out;.  }.  zMas
18e40 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65  terPtr = &zMaste
18e50 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18e60 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63  Journal+1];.  rc
18e70 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
18e80 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (pMaster, zMaste
18e90 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e  rJournal, (int)n
18ea0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
18eb0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18ec0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18ed0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a  lmaster_out;.  z
18ee0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18ef0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20  asterJournal] = 
18f00 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  0;..  zJournal =
18f10 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
18f20 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72  .  while( (zJour
18f30 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
18f40 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
18f50 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78  al ){.    int ex
18f60 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73  ists;.    rc = s
18f70 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
18f80 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
18f90 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
18fa0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
18fb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18fd0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18fe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18ff0 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  exists ){.      
19000 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
19010 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
19020 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
19030 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
19040 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
19050 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
19060 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
19070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
19080 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72  f.      ** so, r
19090 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
190a0 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
190b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
190c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
190d0 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt c;.      int 
190e0 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51 4c  flags = .#if SQL
190f0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
19100 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
19110 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
19120 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
19130 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
19140 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
19150 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
19160 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19170 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
19180 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20  RNAL);.      rc 
19190 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
191a0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
191b0 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c  pJournal, flags,
191c0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
191d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
191e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
191f0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
19200 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20    }..      rc = 
19210 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
19220 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
19230 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
19240 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tr);.      sqlit
19250 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
19260 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
19270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
19290 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
192a0 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a    }..      c = z
192b0 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20  MasterPtr[0]!=0 
192c0 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
192d0 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
192e0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29  0;.      if( c )
192f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  {.        /* We 
19300 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
19310 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
19320 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19330 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
19340 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
19350 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
19360 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b  }.    zJournal +
19370 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
19380 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  30(zJournal)+1);
19390 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33  .  }. .  sqlite3
193a0 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
193b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
193c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
193d0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
193e0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71  master_out:.  sq
193f0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
19400 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19410 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
19420 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
19430 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
19440 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
19450 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73  ournal) );.    s
19460 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
19470 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
19480 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
19490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
194a0 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
194b0 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
194c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
194d0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
194e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
194f0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
19500 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
19510 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
19520 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
19530 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
19540 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
19550 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
19560 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
19570 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19580 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
19590 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65  pen, or the page
195a0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68  r is not in eith
195b0 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f  er.** DBMOD or O
195c0 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20  PEN state, this 
195d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
195e0 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
195f0 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20  the size .** of 
19600 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e  the file is chan
19610 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
19620 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
19630 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
19640 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  ). .** If the fi
19650 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75  le on disk is cu
19660 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74  rrently larger t
19670 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c  han nPage pages,
19680 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46   then use the VF
19690 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29  S.** xTruncate()
196a0 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63   method to trunc
196b0 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72  ate it..**.** Or
196c0 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74  , it might might
196d0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
196e0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
196f0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
19700 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
19710 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
19720 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
19730 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
19740 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
19750 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
19760 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
19770 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
19780 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
19790 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
197a0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
197b0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
197c0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
197d0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
197e0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
197f0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
19800 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
19810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19820 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
19830 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
19840 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
19850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
19860 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
19870 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
19880 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
19890 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
198a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
198b0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
198c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
198d0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
198e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
198f0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
19900 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19910 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
19920 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
19930 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
19940 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
19950 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
19960 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
19970 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
19980 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
19990 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
199a0 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
199b0 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
199c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
199d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
199e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
199f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
19a00 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
19a10 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
19a20 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
19a30 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
19a40 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
19a50 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
19a60 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
19a70 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
19a80 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
19a90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19aa0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
19ab0 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
19ac0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
19ad0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
19ae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
19af0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
19b00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
19b10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
19b20 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
19b30 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
19b40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
19b50 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
19b60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
19b70 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
19b80 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
19b90 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19ba0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19bb0 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
19bc0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
19bd0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
19be0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
19bf0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
19c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19c10 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
19c20 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
19c30 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
19c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19c60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
19c70 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19c80 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19ca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19cb0 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
19cc0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
19cd0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
19ce0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
19cf0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
19d00 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
19d10 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
19d20 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
19d30 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
19d40 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
19d50 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
19d60 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
19d70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
19d80 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
19d90 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
19da0 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
19db0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
19dc0 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
19dd0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
19de0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
19df0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
19e00 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
19e10 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
19e20 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
19e30 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
19e40 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
19e50 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
19e60 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
19e70 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
19e80 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
19e90 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19ea0 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
19eb0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
19ec0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
19ed0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
19ee0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
19ef0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
19f00 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19f10 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19f20 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19f30 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19f40 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
19f50 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
19f60 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
19f70 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19f80 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19f90 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19fa0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
19fb0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
19fc0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
19fd0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
19fe0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19ff0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1a000 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1a010 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1a020 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1a030 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1a040 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1a050 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1a060 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1a070 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1a080 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1a090 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a0a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a0b0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1a0c0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a0d0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1a0e0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1a0f0 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1a100 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1a110 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1a120 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1a130 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1a140 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1a150 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1a160 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1a170 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1a180 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1a190 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1a1a0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1a1b0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1a1c0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1a1d0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1a1e0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1a1f0 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1a200 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1a210 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1a220 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1a230 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1a240 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1a250 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1a260 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1a270 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1a280 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1a290 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1a2a0 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1a2b0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1a2c0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1a2d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a2e0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1a2f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1a300 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a310 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1a320 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a330 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1a340 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1a350 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1a360 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a370 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1a390 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1a3a0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1a3b0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1a3c0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1a3d0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1a3e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1a3f0 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1a400 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1a410 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1a420 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1a430 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1a440 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1a450 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1a460 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1a470 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1a480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1a490 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a4a0 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1a4b0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1a4c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1a4d0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1a4e0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1a4f0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1a500 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1a510 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1a520 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1a530 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1a540 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1a550 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a560 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1a570 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1a580 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1a590 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1a5a0 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1a5b0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a5c0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a5d0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1a5e0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1a5f0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1a600 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1a610 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1a620 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1a630 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1a640 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1a650 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1a660 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1a670 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1a680 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a690 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a6a0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1a6b0 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1a6c0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1a6d0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1a6e0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1a6f0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a700 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1a710 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1a720 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1a730 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1a740 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1a750 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a760 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a770 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1a780 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1a790 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1a7a0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1a7b0 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1a7c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1a7d0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1a7e0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1a7f0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1a800 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1a810 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1a820 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1a830 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1a840 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1a850 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1a860 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1a870 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1a880 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1a890 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1a8a0 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1a8b0 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1a8c0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1a8d0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1a8e0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1a8f0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1a900 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1a910 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1a920 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1a930 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1a940 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1a950 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1a960 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1a970 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1a980 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1a990 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1a9a0 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1a9b0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1a9c0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1a9d0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1a9e0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1a9f0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1aa00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1aa10 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1aa20 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1aa30 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1aa40 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1aa50 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1aa60 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1aa70 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1aa80 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1aa90 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1aaa0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1aab0 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1aac0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1aad0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1aae0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1aaf0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1ab00 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1ab10 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1ab20 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1ab30 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1ab40 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1ab50 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1ab60 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1ab70 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1ab80 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1ab90 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1aba0 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1abb0 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1abc0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1abd0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1abe0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1abf0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1ac00 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1ac10 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1ac20 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1ac30 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1ac40 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1ac50 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1ac60 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1ac70 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1ac80 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1ac90 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1aca0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1acb0 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1acc0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1acd0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1ace0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1acf0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1ad00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1ad10 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1ad20 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1ad30 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1ad40 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1ad50 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1ad60 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1ad70 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1ad80 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1ad90 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1ada0 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1adb0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1adc0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1add0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1ade0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1adf0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1ae00 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1ae10 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1ae20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1ae30 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1ae40 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1ae50 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1ae60 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1ae70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1ae80 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1ae90 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1aea0 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1aeb0 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1aec0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1aed0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1aee0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1aef0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1af00 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1af10 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1af20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1af30 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1af40 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1af50 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1af60 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1af70 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1af80 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1af90 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1afa0 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1afb0 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1afc0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1afd0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1afe0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1aff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1b000 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1b010 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1b020 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1b030 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1b040 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1b050 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1b060 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b080 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1b090 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1b0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b0b0 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1b0c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1b0d0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1b0e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1b0f0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1b100 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1b110 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1b120 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1b130 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1b140 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1b150 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b160 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1b170 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1b180 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1b190 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1b1a0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1b1b0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1b1c0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1b1d0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1b1e0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1b1f0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1b200 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1b210 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1b220 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1b230 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1b240 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1b250 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1b260 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1b270 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1b280 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1b290 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1b2a0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a  rom journal */..
1b2b0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
1b2c0 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
1b2d0 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
1b2e0 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
1b2f0 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
1b300 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
1b310 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69    */.  assert( i
1b320 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1b330 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  d) );.  rc = sql
1b340 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1b350 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
1b360 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1b370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
1b380 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b390 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
1b3a0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1b3b0 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
1b3c0 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
1b3d0 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
1b3e0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1b3f0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
1b400 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
1b410 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
1b420 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
1b430 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
1b440 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
1b450 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
1b460 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
1b470 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
1b480 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
1b490 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
1b4a0 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
1b4b0 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
1b4c0 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
1b4d0 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
1b4e0 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
1b4f0 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
1b500 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
1b510 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
1b520 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
1b530 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1b540 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
1b550 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
1b560 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
1b570 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
1b580 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
1b590 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
1b5a0 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
1b5b0 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
1b5c0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
1b5d0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
1b5e0 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1b5f0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1b600 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1b610 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1b620 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
1b630 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1b640 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
1b650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b660 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
1b670 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
1b680 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
1b690 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
1b6a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1b6b0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
1b6c0 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
1b6d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1b6e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b6f0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
1b700 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
1b710 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
1b720 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
1b730 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
1b740 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
1b750 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
1b760 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
1b770 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
1b780 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
1b790 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
1b7a0 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
1b7b0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 2f  hile( 1 ){.    /
1b7c0 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
1b7d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
1b7e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b7f0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
1b800 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
1b810 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
1b820 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1b830 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
1b840 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
1b850 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
1b860 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
1b870 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65 20  ocess must have 
1b880 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
1b890 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
1b8a0 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
1b8b0 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
1b8c0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1b8d0 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
1b8e0 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
1b8f0 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
1b900 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
1b910 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
1b920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
1b930 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1b940 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1b950 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b960 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
1b970 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b980 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
1b990 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b9a0 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
1b9b0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
1b9c0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
1b9d0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
1b9e0 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
1b9f0 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
1ba00 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
1ba10 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1ba20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
1ba30 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
1ba40 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
1ba50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
1ba60 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
1ba70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1ba80 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
1ba90 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
1baa0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
1bab0 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
1bac0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1bad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1bae0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
1baf0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1bb00 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1bb10 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
1bb20 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
1bb30 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1bb40 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1bb50 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
1bb60 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
1bb70 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
1bb80 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
1bb90 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
1bba0 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
1bbb0 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
1bbc0 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
1bbd0 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
1bbe0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
1bbf0 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
1bc00 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1bc10 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
1bc20 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
1bc30 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
1bc40 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
1bc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1bc60 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
1bc70 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
1bc80 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1bc90 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bca0 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
1bcb0 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
1bcc0 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
1bcd0 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
1bce0 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
1bcf0 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
1bd00 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
1bd10 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bd20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
1bd30 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
1bd40 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
1bd50 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
1bd60 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
1bd70 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
1bd80 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
1bd90 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
1bda0 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
1bdb0 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
1bdc0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
1bdd0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1bde0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
1bdf0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
1be00 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
1be10 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
1be20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
1be30 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1be40 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
1be50 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
1be60 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
1be70 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
1be80 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1be90 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
1bea0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1beb0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
1bec0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1bed0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
1bee0 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
1bef0 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
1bf00 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
1bf10 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
1bf20 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1bf30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bf40 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1bf50 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
1bf60 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bf70 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
1bf80 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1bf90 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
1bfa0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
1bfb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1bfc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bfd0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1bfe0 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
1bff0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
1c000 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
1c010 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
1c020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c030 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1c040 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c050 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1c060 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
1c070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1c080 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
1c090 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
1c0a0 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
1c0b0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
1c0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1c0d0 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
1c0e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
1c0f0 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
1c100 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
1c110 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
1c120 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
1c130 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1c140 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
1c150 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
1c160 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c170 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
1c180 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
1c190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
1c1a0 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
1c1b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c1c0 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61  .        nPlayba
1c1d0 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ck++;.      }els
1c1e0 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e{.        if( r
1c1f0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1c200 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1c210 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c220 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1c230 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c240 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1c250 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c260 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1c270 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1c280 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1c290 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1c2a0 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1c2b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1c2c0 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1c2d0 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1c2e0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1c2f0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1c300 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1c310 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1c320 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1c330 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1c340 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1c350 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1c360 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1c370 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1c380 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1c390 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1c3a0 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1c3b0 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1c3c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1c3d0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1c3e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c3f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c400 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1c410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c420 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1c430 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1c440 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1c450 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1c460 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1c470 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1c480 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1c490 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1c4a0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1c4b0 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1c4c0 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1c4d0 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1c4e0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1c4f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1c500 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1c510 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1c520 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1c530 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1c540 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1c550 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1c560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c570 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1c580 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1c590 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1c5a0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1c5b0 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1c5c0 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1c5d0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1c5e0 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1c5f0 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1c600 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1c610 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1c620 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1c630 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1c640 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1c650 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1c660 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1c670 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1c680 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1c690 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1c6a0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1c6b0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1c6c0 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1c6d0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1c6e0 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1c6f0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1c700 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1c710 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1c720 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1c730 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1c740 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1c750 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1c760 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1c770 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1c780 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1c790 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1c7a0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1c7b0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1c7c0 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1c7d0 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1c7e0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1c7f0 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1c800 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1c810 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1c820 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1c830 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1c840 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1c850 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1c860 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1c870 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1c880 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1c890 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1c8a0 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1c8b0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1c8c0 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1c8d0 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1c8e0 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1c8f0 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1c900 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1c910 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1c920 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1c930 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1c940 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1c950 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1c960 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1c970 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1c980 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1c990 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1c9a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1c9b0 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1c9c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c9d0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1c9e0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1c9f0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1ca00 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1ca10 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1ca20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1ca30 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1ca40 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1ca50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1ca60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ca70 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1ca80 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1ca90 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1caa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1cab0 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1cac0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1cad0 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1cae0 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  er, 0);.  }.  if
1caf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cb00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1cb10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1cb20 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1cb30 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a  r[0]!='\0', 0);.
1cb40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cb50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cb60 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1cb70 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1cb80 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20  r[0] && res ){. 
1cb90 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
1cba0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
1cbb0 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
1cbc0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
1cbd0 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
1cbe0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
1cbf0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
1cc00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1cc10 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
1cc20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
1cc30 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
1cc40 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63  ster);.    testc
1cc50 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1cc60 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1cc70 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62 61  isHot && nPlayba
1cc80 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ck ){.    sqlite
1cc90 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54  3_log(SQLITE_NOT
1cca0 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
1ccb0 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65 64  BACK, "recovered
1ccc0 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20 25   %d pages from %
1ccd0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
1cce0 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70      nPlayback, p
1ccf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1cd00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1cd10 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1cd20 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1cd30 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1cd40 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1cd50 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1cd60 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1cd70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1cd80 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1cd90 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1cda0 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1cdb0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1cdc0 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1cdd0 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1cde0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1cdf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1ce00 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1ce10 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1ce20 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1ce30 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1ce40 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1ce50 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1ce60 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1ce70 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1ce80 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1ce90 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1cea0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ceb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1cec0 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1ced0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1cee0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1cef0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1cf00 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1cf10 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1cf20 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1cf30 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1cf40 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1cf50 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1cf60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1cf70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1cf80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1cf90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1cfa0 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1cfb0 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69 46 72  dr *pPg, u32 iFr
1cfc0 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ame){.  Pager *p
1cfd0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1cfe0 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1cff0 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1d000 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1d010 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1d020 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
1d030 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
1d040 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
1d050 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d060 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1d070 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
1d080 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1d090 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1d0a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1d0b0 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1d0c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1d0d0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1d0e0 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1d0f0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1d100 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69  ager->fd) );..#i
1d110 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d120 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46 72 61  T_WAL.  if( iFra
1d130 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  me ){.    /* Try
1d140 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61 67   to pull the pag
1d150 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74 65  e from the write
1d160 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20  -ahead log. */. 
1d170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1d180 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67  alReadFrame(pPag
1d190 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65  er->pWal, iFrame
1d1a0 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61  , pgsz, pPg->pDa
1d1b0 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ta);.  }else.#en
1d1c0 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  dif.  {.    i64 
1d1d0 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1d1e0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1d1f0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1d200 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1d210 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1d220 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1d230 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1d240 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d250 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d260 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d270 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1d280 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1d290 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1d2a0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d2b0 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1d2c0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1d2d0 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1d2e0 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1d2f0 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1d300 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1d310 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1d320 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1d330 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1d340 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1d350 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1d360 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1d370 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1d380 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1d390 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1d3a0 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1d3b0 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1d3c0 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1d3d0 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1d3e0 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1d3f0 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1d400 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1d410 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1d420 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1d430 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1d440 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1d450 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d460 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1d470 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1d480 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1d490 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1d4a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1d4b0 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d4c0 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1d4d0 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1d4e0 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1d4f0 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1d500 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1d510 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d520 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d530 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d540 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d550 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d560 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d570 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d580 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d590 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d5a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d5b0 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d5c0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d5d0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d5e0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d5f0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d600 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d610 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d620 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1d630 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1d640 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d650 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1d660 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1d670 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d680 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1d690 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1d6a0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1d6b0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1d6c0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1d6d0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1d6e0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1d6f0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1d700 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1d710 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1d720 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1d730 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1d740 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1d750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d760 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1d770 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1d780 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1d790 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1d7a0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1d7b0 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1d7c0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1d7d0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1d7e0 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1d7f0 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1d800 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1d810 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1d820 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1d830 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1d840 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d850 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1d860 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1d870 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1d880 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1d890 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1d8a0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1d8b0 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1d8c0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1d8d0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1d8e0 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1d8f0 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1d900 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1d910 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1d920 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1d930 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1d940 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1d950 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1d960 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1d970 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1d980 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1d990 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1d9a0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d9b0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1d9c0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1d9d0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1d9e0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d9f0 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1da00 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1da10 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1da20 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1da30 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1da40 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1da50 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1da60 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1da70 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1da80 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1da90 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1daa0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dab0 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1dac0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1dad0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1dae0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1daf0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1db00 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1db10 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1db20 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1db30 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1db40 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1db50 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1db60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1db70 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1db80 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1db90 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1dba0 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1dbb0 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1dbc0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1dbd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1dbe0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1dbf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1dc00 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1dc10 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1dc20 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1dc30 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1dc40 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1dc50 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1dc60 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1dc70 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1dc80 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1dc90 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1dca0 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1dcb0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dcc0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1dcd0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1dce0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1dcf0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1dd00 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1dd10 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1dd20 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1dd30 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1dd40 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1dd50 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1dd60 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1dd70 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1dd80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1dd90 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1dda0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1ddb0 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1ddc0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1ddd0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1dde0 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1ddf0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1de00 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1de10 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1de20 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1de30 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1de40 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1de50 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1de60 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1de70 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1de80 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1de90 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1dea0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1deb0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1dec0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1ded0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dee0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1def0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1df00 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1df10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1df20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1df30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1df40 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1df50 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1df60 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1df70 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1df80 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1df90 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1dfa0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1dfb0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1dfc0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1dfd0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1dfe0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1dff0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e000 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e010 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e020 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e030 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e040 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e050 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e060 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e070 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e080 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e090 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e0a0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e0b0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e0c0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e0d0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e0e0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e0f0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e100 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e110 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e120 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e130 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e140 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e150 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e160 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e170 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e180 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e1a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e1b0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e1c0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e1d0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e1e0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e1f0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e200 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e210 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e240 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e250 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e270 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e280 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e290 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e2a0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e2b0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e2c0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e2d0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e2e0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e2f0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e300 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e310 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1e320 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1e330 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1e340 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1e350 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1e360 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1e370 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1e380 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1e390 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1e3a0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1e3b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e3c0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1e3d0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1e3e0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1e3f0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1e400 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1e410 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1e420 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e430 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e440 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e450 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1e460 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1e470 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1e480 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1e490 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1e4a0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1e4b0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1e4c0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1e4d0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1e4e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e4f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1e510 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1e520 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1e530 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1e540 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1e550 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1e560 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1e570 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1e580 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1e590 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1e5a0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1e5b0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1e5c0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1e5d0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1e5e0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1e5f0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e600 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1e610 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1e620 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1e630 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1e640 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1e650 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1e660 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1e670 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1e680 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1e690 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1e6a0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1e6b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1e6c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1e6d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1e6e0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e700 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1e710 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1e720 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1e730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1e740 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1e750 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1e760 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1e770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e780 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1e790 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1e7a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e7d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1e7e0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1e7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1e800 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1e810 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64 65   pList */.#if de
1e820 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1e830 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1e840 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1e850 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  S).  PgHdr *p;  
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1e880 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a  ing over pages *
1e890 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
1e8a0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1e8b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1e8c0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1e8d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1e8e0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1e8f0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1e900 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1e910 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1e920 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1e930 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e940 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1e950 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1e960 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1e970 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1e980 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1e990 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1e9a0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1e9b0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1e9c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1e9d0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1e9e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1e9f0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1ea00 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1ea10 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1ea20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1ea30 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1ea40 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1ea50 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1ea60 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1ea70 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1ea80 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1ea90 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1eaa0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1eab0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 50   PgHdr *p;.    P
1eac0 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20  gHdr **ppNext = 
1ead0 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73  &pList;.    nLis
1eae0 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  t = 0;.    for(p
1eaf0 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74  =pList; (*ppNext
1eb00 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70   = p)!=0; p=p->p
1eb10 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66  Dirty){.      if
1eb20 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e  ( p->pgno<=nTrun
1eb30 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  cate ){.        
1eb40 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1eb50 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69  rty;.        nLi
1eb60 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st++;.      }.  
1eb70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1eb80 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65  pList );.  }else
1eb90 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b  {.    nList = 1;
1eba0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61  .  }.  pPager->a
1ebb0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
1ebc0 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b  WRITE] += nList;
1ebd0 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
1ebe0 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
1ebf0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1ec00 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20  er(pList);.  rc 
1ec10 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  = sqlite3WalFram
1ec20 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  es(pPager->pWal,
1ec30 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
1ec40 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c  pageSize, pList,
1ec50 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f   nTruncate, isCo
1ec60 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61  mmit, pPager->wa
1ec70 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a  lSyncFlags.  );.
1ec80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ec90 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70  _OK && pPager->p
1eca0 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50 67  Backup ){.    Pg
1ecb0 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
1ecc0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ecd0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1ece0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1ecf0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1ed00 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1ed10 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1ed20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1ed30 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1ed40 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1ed50 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1ed60 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1ed70 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1ed80 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1ed90 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1eda0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1edb0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1edc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1edd0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1ede0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1edf0 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1ee00 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1ee10 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1ee20 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1ee30 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
1ee40 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
1ee50 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
1ee60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1ee70 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
1ee80 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
1ee90 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
1eea0 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
1eeb0 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
1eec0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
1eed0 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
1eee0 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
1eef0 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
1ef00 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
1ef10 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
1ef20 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1ef30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ef40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1ef70 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
1ef80 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1ef90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1efa0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
1efb0 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
1efc0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1efd0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1efe0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1eff0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1f000 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1f010 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1f020 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1f030 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1f040 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1f050 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1f060 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1f070 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1f080 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1f090 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1f0a0 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1f0b0 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1f0c0 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1f0d0 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1f0e0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1f0f0 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1f100 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1f110 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1f120 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f130 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f140 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
1f150 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
1f160 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1f170 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
1f180 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
1f190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
1f1a0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
1f1b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1f1c0 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
1f1d0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
1f1e0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
1f1f0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
1f200 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f210 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f220 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f230 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1f240 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1f250 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1f260 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1f270 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1f280 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1f290 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f2a0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1f2b0 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1f2c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1f2d0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1f2e0 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1f2f0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1f300 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1f310 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f320 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1f330 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1f340 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1f350 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1f360 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1f370 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1f380 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1f390 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1f3a0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1f3b0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1f3c0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1f3d0 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1f3e0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1f3f0 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1f400 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f420 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1f430 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1f440 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1f450 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1f460 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1f470 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1f480 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1f490 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f4a0 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1f4b0 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1f4c0 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1f4d0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1f4e0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f4f0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1f500 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1f510 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1f520 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1f530 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1f540 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1f550 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1f560 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1f570 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1f580 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1f590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1f5a0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f5b0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1f5c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1f5d0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1f5e0 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
1f5f0 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1f600 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1f610 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1f620 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20  se size was not 
1f630 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74  available from t
1f640 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
1f650 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  m,.  ** determin
1f660 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68  e it based on th
1f670 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1f680 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
1f690 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66  the size.  ** of
1f6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f6b0 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  le is not an int
1f6c0 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
1f6d0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a   the page-size,.
1f6e0 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20    ** round down 
1f6f0 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70  to the nearest p
1f700 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79  age. Except, any
1f710 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61   file larger tha
1f720 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  n 0.  ** bytes i
1f730 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
1f740 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ered to contain 
1f750 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67  at least one pag
1f760 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  e..  */.  if( nP
1f770 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36  age==0 ){.    i6
1f780 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1f790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1f7a0 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69  ize of db file i
1f7b0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61  n bytes */.    a
1f7c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1f7d0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1f7e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1f7f0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
1f800 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
1f810 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
1f820 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1f830 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
1f840 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f880 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28   nPage = (Pgno)(
1f890 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (n+pPager->pageS
1f8a0 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d  ize-1) / pPager-
1f8b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
1f8c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1f8d0 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70  rent number of p
1f8e0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
1f8f0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1f900 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67   the.  ** config
1f910 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
1f920 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
1f930 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
1f940 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
1f950 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
1f960 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
1f970 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
1f980 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1f990 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
1f9a0 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
1f9b0 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  }..  *pnPage = n
1f9c0 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
1f9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1f9e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f9f0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  _WAL./*.** Check
1fa00 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69   if the *-wal fi
1fa10 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  le that correspo
1fa20 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nds to the datab
1fa30 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50  ase opened by pP
1fa40 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69  ager.** exists i
1fa50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1fa60 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76  s not empy, or v
1fa70 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a  erify that the *
1fa80 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  -wal file does.*
1fa90 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20  * not exist (by 
1faa0 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20  deleting it) if 
1fab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fac0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a  e is empty..**.*
1fad0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1fae0 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61  e is not empty a
1faf0 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  nd the *-wal fil
1fb00 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74  e exists, open t
1fb10 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57  he pager.** in W
1fb20 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65  AL mode.  If the
1fb30 20 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70   database is emp
1fb40 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61  ty or if no *-wa
1fb50 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
1fb60 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72  d.** if no error
1fb70 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75   occurs, make su
1fb80 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  re Pager.journal
1fb90 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20  Mode is not set 
1fba0 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  to.** PAGER_JOUR
1fbb0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a  NALMODE_WAL..**.
1fbc0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1fbd0 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  _OK or an error 
1fbe0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  code..**.** The 
1fbf0 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64  caller must hold
1fc00 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f   a SHARED lock o
1fc10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1fc20 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ile to call this
1fc30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65  .** function. Be
1fc40 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49  cause an EXCLUSI
1fc50 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
1fc60 62 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  b file is requir
1fc70 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a  ed to delete .**
1fc80 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65   a WAL on a none
1fc90 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c  -empty database,
1fca0 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
1fcb0 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63  ere is no race c
1fcc0 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74  ondition .** bet
1fcd0 77 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73  ween the xAccess
1fce0 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20  () below and an 
1fcf0 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20  xDelete() being 
1fd00 65 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65  executed by some
1fd10 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65   .** other conne
1fd20 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1fd30 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61   int pagerOpenWa
1fd40 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72  lIfPresent(Pager
1fd50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1fd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fd80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1fd90 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72  _OPEN );.  asser
1fda0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
1fdb0 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
1fdc0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
1fdd0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
1fde0 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20   int isWal;     
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe00 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69  * True if WAL fi
1fe10 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  le exists */.   
1fe20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe40 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * Size of the da
1fe50 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
1fe60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
1fe70 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1fe80 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
1fe90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1fea0 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  .    if( nPage==
1feb0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1fec0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1fed0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1fee0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a  ager->zWal, 0);.
1fef0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ff00 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1ff10 45 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53  E_NOENT ) rc = S
1ff20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1ff30 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  isWal = 0;.    }
1ff40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ff50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1ff60 28 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  (.          pPag
1ff70 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1ff80 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ->zWal, SQLITE_A
1ff90 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69  CCESS_EXISTS, &i
1ffa0 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20  sWal.      );.  
1ffb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1ffc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ffd0 20 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a     if( isWal ){.
1ffe0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1fff0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
20000 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
20010 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
20020 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20030 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
20040 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
20050 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
20060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20070 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
20080 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20  ODE_WAL ){.     
20090 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
200a0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
200b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
200c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
200d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
200e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
200f0 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70  * Playback savep
20100 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e  oint pSavepoint.
20110 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69   Or, if pSavepoi
20120 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70  nt==NULL, then p
20130 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65  layback.** the e
20140 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
20150 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63  rnal file. The c
20160 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d  ase pSavepoint==
20170 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e  NULL occurs when
20180 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20   .** a ROLLBACK 
20190 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e  TO command is in
201a0 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50  voked on a SAVEP
201b0 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
201c0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73  ransaction .** s
201d0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
201e0 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20  When pSavepoint 
201f0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61  is not NULL (mea
20200 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73  ning a non-trans
20210 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
20220 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f   is .** being ro
20230 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e  lled back), then
20240 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f   the rollback co
20250 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20  nsists of up to 
20260 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a  three stages,.**
20270 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68   performed in th
20280 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65  e order specifie
20290 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  d:.**.**   * Pag
202a0 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  es are played ba
202b0 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
202c0 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
202d0 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  g at byte.**    
202e0 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76   offset PagerSav
202f0 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
20300 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
20310 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61   .**     PagerSa
20320 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
20330 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e  et, or to the en
20340 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
20350 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c  urnal.**     fil
20360 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f  e if PagerSavepo
20370 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
20380 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20  s zero..**.**   
20390 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f  * If PagerSavepo
203a0 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69  int.iHdrOffset i
203b0 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e  s not zero, then
203c0 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   pages are playe
203d0 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74  d.**     back st
203e0 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  arting from the 
203f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
20400 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
20410 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67  wing .**     Pag
20420 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
20430 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e  Offset to the en
20440 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  d of the main jo
20450 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20460 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
20470 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  then played back
20480 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
20490 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72  urnal file, star
204a0 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68  ting.**     with
204b0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
204c0 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20  int.iSubRec and 
204d0 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
204e0 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20  e end of.**     
204f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20500 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f  ..**.** Througho
20510 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ut the rollback 
20520 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69  process, each ti
20530 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c  me a page is rol
20540 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a  led back, the.**
20550 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
20560 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62  it is set in a b
20570 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
20580 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20  (variable pDone 
20590 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d  in the.** implem
205a0 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e  entation below).
205b0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
205c0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70   ensure that a p
205d0 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72  age is only.** r
205e0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66  olled back the f
205f0 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20  irst time it is 
20600 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65  encountered in e
20610 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ither journal..*
20620 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69  *.** If pSavepoi
20630 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  nt is NULL, then
20640 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20   pages are only 
20650 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
20660 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
20670 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65  rnal file. There
20680 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
20690 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73  a bitvec in this
206a0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   case..**.** In 
206b0 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66  either case, bef
206c0 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d  ore playback com
206d0 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72  mences the Pager
206e0 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65  .dbSize variable
206f0 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20  .** is reset to 
20700 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69  the value that i
20710 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74  t held at the st
20720 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70  art of the savep
20730 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61  oint .** (or tra
20740 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61  nsaction). No pa
20750 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e  ge with a page-n
20760 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
20770 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a  an this value.**
20780 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   is played back.
20790 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75   If one is encou
207a0 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d  ntered it is sim
207b0 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  ply skipped..*/.
207c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
207d0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
207e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
207f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
20800 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
20810 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
20820 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
20830 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
20840 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
20850 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20870 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
20880 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
20890 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
208a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
208b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
208c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
208d0 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30  itvec *pDone = 0
208e0 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65  ;       /* Bitve
208f0 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65  c to ensure page
20900 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e  s played back on
20910 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73  ly once */..  as
20920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
20930 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
20940 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
20950 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
20960 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
20970 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ED );..  /* Allo
20980 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f  cate a bitvec to
20990 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68   use to store th
209a0 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72  e set of pages r
209b0 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  olled back */.  
209c0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
209d0 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71  {.    pDone = sq
209e0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
209f0 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f  e(pSavepoint->nO
20a00 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70  rig);.    if( !p
20a10 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Done ){.      re
20a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20a30 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  M;.    }.  }..  
20a40 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
20a50 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
20a60 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
20a70 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
20a80 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
20a90 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
20aa0 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
20ab0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20ac0 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
20ad0 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
20ae0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
20af0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
20b00 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
20b10 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20b20 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
20b30 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
20b40 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
20b50 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
20b60 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
20b70 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
20b80 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
20b90 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
20ba0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
20bb0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
20bc0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
20bd0 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
20be0 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
20bf0 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
20c00 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20c10 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
20c20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20c30 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
20c40 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
20c50 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
20c60 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
20c70 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
20c80 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
20c90 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
20ca0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
20cb0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
20cc0 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
20cd0 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
20ce0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
20cf0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
20d00 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
20d10 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
20d20 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20d30 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
20d40 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
20d50 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
20d60 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
20d70 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
20d80 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
20d90 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
20da0 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
20db0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
20dc0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
20dd0 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
20de0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
20df0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
20e00 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
20e10 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
20e20 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
20e30 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
20e40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
20e50 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
20e60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
20e70 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
20e80 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
20e90 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
20ea0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
20eb0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
20ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
20ed0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
20ee0 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
20ef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20f00 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
20f10 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
20f20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20f30 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20f40 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
20f50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
20f60 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
20f70 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20f80 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20fb0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
20fc0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
20fd0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
20fe0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
20ff0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
21000 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
21010 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
21020 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
21030 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
21040 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
21050 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
21060 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
21070 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
21080 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
21090 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
210a0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
210b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
210c0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
210d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
210e0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
210f0 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
21100 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21110 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21120 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
21130 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
21140 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
21150 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
21160 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
21170 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
21180 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
21190 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
211a0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
211b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
211c0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
211d0 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
211e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
211f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
21200 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
21210 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
21220 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
21230 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
21240 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
21250 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
21260 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
21270 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
21280 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
21290 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
212a0 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
212b0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
212c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
212d0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
212e0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
212f0 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
21300 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
21310 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
21320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
21330 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
21340 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
21350 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
21360 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21370 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
21380 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
21390 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
213a0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
213b0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
213c0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
213d0 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
213e0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
213f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21400 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
21410 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21420 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
21430 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
21440 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
21450 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
21460 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
21470 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
21480 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
21490 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
214a0 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
214b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
214c0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
214d0 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
214e0 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
214f0 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
21500 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
21510 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
21520 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
21530 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
21540 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21550 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
21560 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
21570 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
21580 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21590 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
215a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
215b0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
215c0 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
215d0 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
215e0 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
215f0 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
21600 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
21610 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
21620 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
21630 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
21640 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
21650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
21660 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
21670 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
21680 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
21690 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
216a0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
216b0 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
216c0 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
216d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
216e0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
216f0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
21700 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
21710 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
21730 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21740 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
21750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21760 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
21770 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
21780 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
21790 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
217a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
217b0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
217c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
217d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
217e0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
217f0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
21800 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
21810 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
21820 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
21830 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
21840 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
21850 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
21860 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
21870 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
21880 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21890 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
218a0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
218b0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
218c0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
218d0 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
218e0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
218f0 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
21900 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21910 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
21920 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
21930 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
21940 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
21950 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
21960 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
21970 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
21980 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
21990 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
219a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
219b0 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
219c0 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
219d0 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
219e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
219f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
21a00 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
21a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
21a20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
21a30 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
21a40 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
21a50 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
21a60 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
21a70 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
21a80 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
21a90 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
21aa0 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
21ab0 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
21ac0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
21ad0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
21ae0 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
21af0 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
21b00 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
21b10 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
21b20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
21b30 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
21b40 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
21b50 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
21b60 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
21b70 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
21b80 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
21b90 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
21ba0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
21bb0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
21bc0 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
21bd0 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
21be0 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
21bf0 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
21c00 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
21c10 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
21c20 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
21c30 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
21c40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21c50 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
21c60 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
21c70 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
21c90 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
21ca0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
21cb0 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
21cc0 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
21cd0 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
21ce0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
21cf0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
21d00 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
21d10 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
21d20 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
21d30 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
21d50 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
21d60 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
21d70 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
21d80 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
21d90 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
21da0 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
21db0 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
21dc0 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
21dd0 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
21de0 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
21df0 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
21e00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
21e10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
21e20 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
21e30 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
21e40 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
21e50 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
21e60 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
21e70 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
21e80 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21e90 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
21ea0 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
21eb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
21ec0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
21ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
21ef0 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
21f00 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
21f10 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
21f20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
21f30 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
21f40 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
21f50 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
21f60 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
21f70 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
21f80 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
21f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21fa0 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
21fb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
21fc0 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
21fd0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
21fe0 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
21ff0 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
22000 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
22010 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
22020 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
22030 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
22040 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
22050 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
22060 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
22070 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
22080 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
22090 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
220a0 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
220b0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
220c0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
220d0 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
220e0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
220f0 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
22100 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
22110 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
22120 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
22130 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
22140 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
22150 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
22160 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
22170 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
22180 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
22190 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
221a0 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
221b0 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
221c0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
221d0 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
221e0 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
221f0 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
22200 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
22210 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
22220 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
22230 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
22240 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
22250 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
22260 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
22270 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
22280 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
22290 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
222a0 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
222b0 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
222c0 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
222d0 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
222e0 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
222f0 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
22300 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
22310 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
22320 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22330 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22340 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22350 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
22360 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
22370 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
22380 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
22390 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
223a0 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
223b0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
223c0 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
223d0 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
223e0 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
223f0 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
22400 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
22410 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
22420 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
22430 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22440 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
22450 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
22460 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
22470 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
22480 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
22490 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
224a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
224b0 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
224c0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
224d0 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
224e0 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
224f0 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
22500 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
22510 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
22520 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
22530 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
22540 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
22550 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72  US_MASK;.  asser
22560 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
22570 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
22580 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
22590 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
225a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
225b0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
225c0 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
225d0 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
225e0 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
225f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
22600 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22610 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
22620 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22630 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
22640 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
22650 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c  lags & PAGER_FUL
22660 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22670 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22680 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22690 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  LL;.    pPager->
226a0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
226b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
226c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
226d0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b  Flags & PAGER_CK
226e0 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  PT_FULLFSYNC ){.
226f0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22700 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22710 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
22720 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22730 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22740 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
22750 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
22760 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
22770 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
22780 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
22790 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
227a0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
227b0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c   }.  pPager->wal
227c0 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  SyncFlags = pPag
227d0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
227e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
227f0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
22800 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
22810 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52  s |= WAL_SYNC_TR
22820 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a  ANSACTIONS;.  }.
22830 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20    if( pgFlags & 
22840 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c  PAGER_CACHESPILL
22850 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22860 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
22870 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22880 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
22890 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
228a0 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a   SPILLFLAG_OFF;.
228b0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
228c0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
228d0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
228e0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
228f0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
22900 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
22910 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
22920 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
22930 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
22940 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
22950 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22960 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
22970 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
22980 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
22990 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
229a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
229b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
229c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
229d0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
229e0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
229f0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
22a00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
22a10 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
22a20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
22a30 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
22a40 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
22a50 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
22a60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
22a70 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
22a80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
22a90 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
22aa0 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
22ab0 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
22ac0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
22ad0 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
22ae0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
22af0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
22b00 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
22b10 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
22b20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
22b30 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
22b40 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
22b50 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
22b60 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
22b70 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
22b80 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
22b90 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22ba0 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
22bb0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
22bc0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
22bd0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
22be0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22bf0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
22c00 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
22c10 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
22c20 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
22c30 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
22c40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22c50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
22c60 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
22c70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
22c80 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
22c90 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
22ca0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
22cb0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
22cc0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
22cd0 46 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53  Flags |=  .#if S
22ce0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
22cf0 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
22d00 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
22d10 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
22d20 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
22d30 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
22d40 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
22d50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22d60 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
22d70 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
22d80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22d90 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
22da0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
22db0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
22dc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
22dd0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
22de0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
22df0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
22e00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
22e10 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
22e20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22e30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
22e40 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
22e50 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
22e60 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
22e70 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
22e80 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
22e90 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
22ea0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
22eb0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
22ec0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
22ed0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
22ee0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
22ef0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22f00 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
22f10 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
22f20 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
22f30 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
22f40 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
22f50 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
22f60 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
22f70 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
22f80 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22f90 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
22fa0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
22fb0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
22fc0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
22fd0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
22fe0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
22ff0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23000 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23010 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23020 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23060 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23070 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23080 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
23090 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
230a0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
230b0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
230c0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
230d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
230e0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
230f0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
23100 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
23110 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
23120 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
23130 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
23140 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
23150 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
23160 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
23170 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
23180 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
23190 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
231a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
231b0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
231c0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
231d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
231e0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
231f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
23220 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
23230 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
23240 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
23250 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
23260 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
23270 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
23280 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
23290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
232a0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
232b0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
232c0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
232d0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
232e0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
232f0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
23300 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
23310 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
23320 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23330 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
23340 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
23350 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23360 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
23370 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
23380 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
23390 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
233a0 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
233b0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
233c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
233d0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
233e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
233f0 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
23400 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
23410 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23420 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
23430 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
23440 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
23450 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
23460 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
23470 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
23480 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
23490 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
234a0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
234b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
234c0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
234d0 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
234e0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
234f0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
23500 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
23510 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
23520 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
23530 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
23540 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
23550 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
23560 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
23570 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
23580 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
23590 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
235a0 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
235b0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
235c0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
235d0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
235e0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
235f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
23600 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
23610 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
23620 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
23630 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
23640 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
23650 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
23660 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
23670 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23680 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
23690 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
236a0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
236b0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
236c0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
236d0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
236e0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
236f0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
23700 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23710 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23720 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
23730 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
23740 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
23750 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
23760 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
23770 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
23780 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
23790 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
237a0 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
237b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
237c0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
237d0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
237e0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
237f0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
23800 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
23810 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
23820 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23830 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
23840 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
23850 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
23860 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
23870 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
23880 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
23890 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
238a0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
238b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
238c0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
238d0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
238e0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
238f0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
23900 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
23910 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
23920 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
23930 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
23940 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
23950 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
23960 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
23970 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
23980 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
23990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
239a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
239b0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
239c0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
239d0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
239e0 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
239f0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
23a00 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
23a10 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
23a20 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
23a30 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
23a40 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
23a50 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
23a60 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
23a70 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
23a80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23a90 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
23aa0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
23ab0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
23ac0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
23ad0 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
23ae0 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
23af0 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
23b00 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
23b10 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
23b20 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
23b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
23b40 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
23b50 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
23b60 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
23b70 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
23b80 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
23b90 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
23ba0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
23bb0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
23bc0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23bd0 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
23be0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
23bf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
23c00 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
23c10 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
23c20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
23c30 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
23c40 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
23c50 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
23c60 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
23c70 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
23c80 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
23c90 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
23ca0 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
23cb0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
23cc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
23cd0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
23ce0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23cf0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23d00 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
23d10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
23d20 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
23d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23d40 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
23d50 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
23d60 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
23d70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
23d80 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
23d90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23da0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
23db0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23dc0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
23dd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
23de0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
23df0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
23e00 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
23e10 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23e20 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
23e30 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
23e40 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
23e50 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
23e60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
23e70 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
23e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23e90 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
23ea0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
23eb0 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
23ec0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
23ed0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
23ee0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
23ef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23f00 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
23f10 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
23f20 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
23f30 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
23f40 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
23f50 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
23f60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
23f70 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
23f80 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
23f90 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
23fa0 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
23fb0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
23fc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23fd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
23fe0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23ff0 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
24000 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
24010 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
24020 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
24030 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
24040 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
24050 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
24060 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
24070 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
24080 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
24090 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
240a0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
240b0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
240c0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
240d0 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
240e0 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
240f0 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
24100 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
24110 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
24120 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
24130 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
24140 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
24150 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
24160 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24170 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
24180 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
24190 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
241a0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
241b0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
241c0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
241d0 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
241e0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
241f0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
24200 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
24210 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
24220 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
24230 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
24240 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
24250 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
24260 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
24270 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
24280 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
24290 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
242a0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
242b0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
242c0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
242d0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
242e0 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
242f0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
24300 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
24310 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24320 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
24330 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
24340 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
24350 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
24360 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24370 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
24380 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
24390 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
243a0 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
243b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
243c0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
243d0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
243e0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
243f0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
24400 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
24410 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
24420 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
24430 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
24440 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
24450 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
24460 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
24470 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
24480 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
24490 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
244a0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
244b0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
244c0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
244d0 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
244e0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
244f0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
24500 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24510 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
24520 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
24530 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24540 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
24550 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
24560 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
24570 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24580 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
24590 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
245a0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
245b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
245c0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
245d0 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
245e0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
245f0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
24600 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
24610 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
24620 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
24630 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24640 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
24650 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
24660 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24670 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
24680 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
24690 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
246a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
246b0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
246c0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
246d0 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
246e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
246f0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
24700 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
24710 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
24720 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
24730 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
24740 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
24750 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
24760 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
24770 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
24780 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
24790 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
247a0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
247b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
247c0 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
247d0 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
247e0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
247f0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
24800 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
24810 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
24820 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
24830 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
24840 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
24850 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
24860 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
24870 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
24880 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
24890 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
248a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
248b0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
248c0 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
248d0 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
248e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
248f0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
24900 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
24910 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
24920 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
24930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
24940 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
24950 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
24960 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
24970 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
24980 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24990 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
249a0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
249b0 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
249c0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
249d0 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
249e0 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
249f0 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
24a00 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
24a10 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
24a20 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
24a30 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
24a40 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
24a50 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
24a60 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
24a70 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
24a80 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
24a90 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
24aa0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
24ab0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
24ac0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
24ad0 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
24ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
24af0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
24b00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24b10 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
24b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24b30 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24b40 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
24b50 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
24b60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
24b70 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
24b80 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
24b90 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
24ba0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
24bb0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
24bc0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
24bd0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
24be0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
24bf0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
24c00 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
24c10 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
24c20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
24c30 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24c40 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
24c50 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
24c60 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
24c70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
24c80 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
24c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24ca0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
24cb0 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
24cc0 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
24cd0 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
24ce0 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
24cf0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
24d00 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
24d10 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
24d20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
24d30 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
24d40 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
24d50 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
24d60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24d70 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
24d80 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
24d90 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
24da0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
24db0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
24dc0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
24dd0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
24de0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
24df0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
24e00 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
24e10 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
24e20 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
24e30 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
24e40 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
24e50 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
24e60 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
24e70 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
24e80 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
24e90 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
24ea0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
24eb0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
24ec0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
24ed0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
24ee0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
24ef0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
24f00 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
24f10 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
24f20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
24f30 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
24f40 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
24f50 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
24f60 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
24f70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
24f80 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fb0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
24fc0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
24fd0 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
24fe0 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
24ff0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
25000 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
25010 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
25020 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
25030 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
25040 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
25050 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
25060 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
25070 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
25080 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
25090 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
250a0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
250b0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
250c0 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
250d0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
250e0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
250f0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
25100 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
25110 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
25120 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
25130 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25140 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
25150 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
25160 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
25170 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
25180 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
25190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
251a0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
251b0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
251c0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
251d0 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
251e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
251f0 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
25200 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
25210 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
25220 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
25230 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
25240 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
25250 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
25260 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
25270 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
25280 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
25290 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
252a0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
252b0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
252c0 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
252d0 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
252e0 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
252f0 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
25300 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
25310 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
25320 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
25330 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
25340 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
25350 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
25360 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
25370 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
25380 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
25390 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
253a0 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
253b0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
253c0 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
253d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
253e0 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
253f0 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
25400 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
25410 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
25420 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
25430 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
25440 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
25450 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
25460 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
25470 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
25480 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
25490 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
254a0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
254b0 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
254c0 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
254d0 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
254e0 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
254f0 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
25500 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
25510 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
25520 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
25530 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
25540 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
25550 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
25560 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
25570 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
25580 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
25590 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
255a0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
255b0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
255c0 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
255d0 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
255e0 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
255f0 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
25600 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
25610 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
25620 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
25630 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
25640 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
25650 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
25660 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
25670 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25680 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25690 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
256a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
256b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
256c0 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
256d0 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
256e0 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
256f0 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
25700 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
25710 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25720 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
25730 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
25740 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25750 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
25760 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
25770 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25780 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
25790 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
257a0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
257b0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
257c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
257d0 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
257e0 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
257f0 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
25800 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
25810 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
25820 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
25830 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
25840 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
25850 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
25860 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
25870 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
25880 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
25890 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
258a0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
258b0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
258c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
258d0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
258e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
258f0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
25900 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25910 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25920 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
25930 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
25940 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
25950 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
25960 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
25970 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
25980 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
25990 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
259a0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
259b0 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
259c0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
259d0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
259e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
259f0 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
25a00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
25a10 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25a20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
25a30 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
25a40 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25a50 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
25a60 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
25a70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
25a80 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
25a90 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
25aa0 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
25ab0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25ac0 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
25ad0 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
25ae0 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
25af0 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
25b00 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
25b10 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
25b20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
25b30 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
25b40 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
25b50 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
25b60 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
25b70 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
25b80 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
25b90 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
25ba0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
25bb0 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
25bc0 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
25bd0 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
25be0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
25bf0 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
25c00 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
25c10 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
25c20 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
25c30 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
25c40 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
25c50 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
25c60 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
25c70 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
25c80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
25c90 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
25ca0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
25cb0 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
25cc0 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
25cd0 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
25ce0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25cf0 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
25d00 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
25d10 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
25d20 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
25d30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
25d40 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
25d50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25d60 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
25d70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
25d80 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
25d90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
25da0 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
25db0 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
25dc0 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
25dd0 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
25de0 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
25df0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
25e00 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
25e10 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
25e20 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
25e30 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
25e40 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
25e50 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
25e60 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
25e70 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
25e80 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
25e90 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
25ea0 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
25eb0 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
25ec0 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
25ed0 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
25ee0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
25ef0 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
25f00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
25f10 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
25f20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
25f30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
25f40 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
25f50 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
25f60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
25f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25f80 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
25f90 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
25fa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
25fb0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
25fc0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
25fd0 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
25fe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26000 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
26010 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
26020 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
26030 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26040 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20  ./*.** Obtain a 
26050 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d  reference to a m
26060 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26070 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67  e object for pag
26080 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a  e number pgno. .
26090 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
260a0 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70  t will use the p
260b0 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62  ointer pData, ob
260c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74  tained from xFet
260d0 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63  ch()..** If succ
260e0 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50  essful, set *ppP
260f0 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  age to point to 
26100 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66  the new page ref
26110 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65  erence.** and re
26120 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
26130 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
26140 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
26150 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a  r code and set.*
26160 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72  * *ppPage to zer
26170 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65  o..**.** Page re
26180 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65  ferences obtaine
26190 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  d by calling thi
261a0 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
261b0 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a  d be released.**
261c0 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65   by calling page
261d0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
261e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
261f0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
26200 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70  Page(.  Pager *p
26210 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
26220 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
26230 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e   object */.  Pgn
26240 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
26250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26260 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  Page number */. 
26270 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
26280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26290 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64   /* xFetch()'d d
262a0 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67  ata for this pag
262b0 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70  e */.  PgHdr **p
262c0 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  pPage           
262d0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41         /* OUT: A
262e0 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a  cquired page obj
262f0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  ect */.){.  PgHd
26300 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
26310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
26320 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67  emory mapped pag
26330 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
26340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
26350 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
26360 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
26370 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26380 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
26390 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
263a0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
263b0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
263c0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
263d0 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
263e0 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
263f0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26400 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26410 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26420 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26430 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26440 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26450 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26460 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26470 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
26480 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
26490 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
264a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
264b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
264c0 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d  .    p->pExtra =
264d0 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a   (void *)&p[1];.
264e0 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50      p->flags = P
264f0 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70  GHDR_MMAP;.    p
26500 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
26510 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  p->pPager = pPag
26520 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  er;.  }..  asser
26530 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76  t( p->pExtra==(v
26540 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20  oid *)&p[1] );. 
26550 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26560 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
26570 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44  ( p->flags==PGHD
26580 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65  R_MMAP );.  asse
26590 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70  rt( p->pPager==p
265a0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
265b0 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  t( p->nRef==1 );
265c0 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67  ..  p->pgno = pg
265d0 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d  no;.  p->pData =
265e0 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72   pData;.  pPager
265f0 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20  ->nMmapOut++;.. 
26600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26610 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  K;.}../*.** Rele
26620 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
26630 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50 67  to page pPg. pPg
26640 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
26650 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 0a  returned by an .
26660 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  ** earlier call 
26670 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  to pagerAcquireM
26680 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
26690 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
266a0 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67 48  leaseMapPage(PgH
266b0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
266c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
266d0 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67 65  >pPager;.  pPage
266e0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20  r->nMmapOut--;. 
266f0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
26700 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26710 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  list;.  pPager->
26720 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
26730 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
26740 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
26750 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d  hods->iVersion>=
26760 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  3 );.  sqlite3Os
26770 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
26780 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e 70  fd, (i64)(pPg->p
26790 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
267a0 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44  ageSize, pPg->pD
267b0 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ata);.}../*.** F
267c0 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f 62  ree all PgHdr ob
267d0 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e 20  jects stored in 
267e0 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70 46  the Pager.pMmapF
267f0 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f  reelist list..*/
26800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26810 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50 61  erFreeMapHdrs(Pa
26820 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26830 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48 64  PgHdr *p;.  PgHd
26840 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28  r *pNext;.  for(
26850 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  p=pPager->pMmapF
26860 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e  reelist; p; p=pN
26870 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
26880 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
26890 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
268a0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
268b0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
268c0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
268d0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
268e0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
268f0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
26900 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
26910 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
26920 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
26930 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
26940 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
26950 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
26960 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
26970 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
26980 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
26990 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
269a0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
269b0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
269c0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
269d0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
269e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
269f0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
26a00 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
26a10 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
26a20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26a30 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
26a40 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
26a50 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
26a60 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
26a70 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
26a80 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
26a90 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
26aa0 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
26ab0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
26ac0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
26ad0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
26ae0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26af0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
26b00 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
26b10 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
26b20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75  er *pPager){.  u
26b30 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29  8 *pTmp = (u8 *)
26b40 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
26b50 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  e;..  assert( as
26b60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
26b70 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
26b80 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
26b90 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
26ba0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
26bb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
26bc0 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
26bd0 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
26be0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
26bf0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
26c00 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
26c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26c20 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69 74  OMIT_WAL.  sqlit
26c30 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
26c40 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72 2d  r->pWal, pPager-
26c50 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c 20  >ckptSyncFlags, 
26c60 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
26c70 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67 65  , pTmp);.  pPage
26c80 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e  r->pWal = 0;.#en
26c90 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65  dif.  pager_rese
26ca0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
26cb0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
26cc0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
26cd0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
26ce0 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65   /* If it is ope
26cf0 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n, sync the jour
26d00 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
26d10 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e  calling UnlockAn
26d20 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a  dRollback..    *
26d30 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  * If this is not
26d40 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75   done, then an u
26d50 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
26d60 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
26d70 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  nal .    ** file
26d80 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20 62   may be played b
26d90 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
26da0 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65  abase. If a powe
26db0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
26dc0 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74   .    ** while t
26dd0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
26de0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
26df0 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72  ould become corr
26e00 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  upt..    **.    
26e10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
26e20 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
26e30 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a  ng to sync the j
26e40 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68  ournal, shift th
26e50 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69  e pager.    ** i
26e60 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
26e70 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65 73  ate. This causes
26e80 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61   UnlockAndRollba
26e90 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  ck to unlock the
26ea0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
26eb0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a   and close the j
26ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68  ournal file with
26ed0 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74  out attempting t
26ee0 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a  o roll it.    **
26ef0 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a   back or finaliz
26f00 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64  e it. The next d
26f10 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69 6c  atabase user wil
26f20 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74  l have to do hot
26f30 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
26f40 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20  rollback before 
26f50 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
26f60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
26f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70   */.    if( isOp
26f80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
26f90 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
26fa0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67  rror(pPager, pag
26fb0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
26fc0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
26fd0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
26fe0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
26ff0 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
27000 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
27010 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
27020 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
27030 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
27040 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
27050 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27060 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
27070 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
27080 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
27090 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
270a0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  fd);.  sqlite3Os
270b0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
270c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
270d0 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71  Free(pTmp);.  sq
270e0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
270f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
27100 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
27110 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
27120 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
27130 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78  Free ) pPager->x
27140 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72  CodecFree(pPager
27150 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69  ->pCodec);.#endi
27160 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  f..  assert( !pP
27170 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
27180 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
27190 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
271a0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
271b0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
271c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
271d0 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
271e0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
271f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27200 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
27210 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
27220 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
27230 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
27240 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
27250 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
27260 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
27270 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
27280 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
27290 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
272a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
272b0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
272c0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
272d0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
272e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
272f0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
27300 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27310 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
27320 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
27330 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
27340 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
27350 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
27360 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
27370 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
27380 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
27390 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
273a0 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
273b0 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
273c0 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
273d0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
273e0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
273f0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
27400 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61  Pager.noSync fla
27410 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
27420 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27430 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65  a no-op..** Othe
27440 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
27450 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
27460 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
27470 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a  l-mode and the .
27480 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61 63  ** device charac
27490 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65  teristics of the
274a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
274b0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
274c0 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
274d0 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
274e0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
274f0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
27500 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
27510 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
27520 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
27530 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
27540 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
27550 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
27560 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
27570 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
27580 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
27590 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
275a0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
275b0 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
275c0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
275d0 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
275e0 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
275f0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
27600 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
27610 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
27620 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
27630 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
27640 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
27650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
27660 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
27670 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
27680 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
27690 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
276a0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
276b0 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
276c0 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
276d0 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
276e0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
276f0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
27700 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
27710 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
27720 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
27730 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
27740 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
27750 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
27760 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
27770 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
27780 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
27790 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
277a0 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
277b0 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
277c0 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
277d0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
277e0 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
277f0 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
27800 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
27810 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
27820 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
27830 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
27840 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
27850 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
27860 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
27870 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
27880 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
27890 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
278a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
278b0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
278c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
278d0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
278e0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
278f0 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27910 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27920 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
27930 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
27940 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
27950 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
27960 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
27970 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
27980 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
27990 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
279a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
279b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
279c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
279d0 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
279e0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
279f0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
27a00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27a10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27a20 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
27a30 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
27a40 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
27a50 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
27a60 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
27a70 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
27a80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
27a90 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27aa0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
27ab0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
27ac0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
27ad0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
27ae0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
27af0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
27b00 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27b10 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
27b20 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
27b30 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
27b40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27b50 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
27b60 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
27b70 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
27b80 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
27b90 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
27ba0 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
27bb0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
27bc0 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
27bd0 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
27be0 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
27bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27c00 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
27c10 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
27c20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
27c30 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
27c40 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
27c50 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
27c60 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
27c70 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
27c80 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
27c90 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
27ca0 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
27cb0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
27cc0 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
27cd0 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
27ce0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
27cf0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
27d00 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
27d10 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
27d20 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
27d30 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
27d40 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
27d50 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
27d60 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
27d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
27d80 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
27d90 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
27da0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
27db0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
27dc0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
27dd0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
27de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
27df0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
27e00 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
27e10 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
27e20 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
27e30 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
27e40 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
27e50 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
27e60 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
27e70 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
27e80 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
27e90 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
27ea0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
27eb0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
27ec0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
27ed0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
27ee0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
27ef0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
27f00 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
27f10 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
27f20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
27f30 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
27f40 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
27f50 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
27f60 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
27f70 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
27f80 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
27f90 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
27fa0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
27fb0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
27fc0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
27fd0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
27fe0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
27ff0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
28000 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
28010 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
28020 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
28030 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
28040 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
28050 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
28060 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
28070 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
28080 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
28090 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
280a0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
280b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
280c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
280d0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
280e0 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
280f0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
28100 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
28110 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
28120 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
28130 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
28140 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
28150 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
28160 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
28170 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28180 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
28190 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
281a0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
281b0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
281c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
281d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
281e0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
281f0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
28200 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
28210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28220 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
28230 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
28240 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
28250 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
28260 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
28270 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
28280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28290 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
282a0 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
282b0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
282c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
282d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
282e0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
282f0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
28300 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
28310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28320 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28330 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
28340 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
28350 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
28360 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
28370 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
28380 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
28390 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
283a0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
283b0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
283c0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
283d0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
283e0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
283f0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
28400 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
28410 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
28420 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
28430 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
28440 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
28450 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
28460 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
28470 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
28480 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
28490 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
284a0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
284b0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
284c0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
284d0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
284e0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
284f0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
28500 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
28510 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
28520 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
28530 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
28540 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
28550 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
28560 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
28570 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
28580 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
28590 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
285a0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
285b0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
285c0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
285d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
285e0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
285f0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
28600 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28610 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
28620 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
28630 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
28640 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28650 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
28660 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
28670 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
28680 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28690 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
286a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
286b0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
286c0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
286d0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
286e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
286f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28700 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
28710 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28720 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
28730 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
28740 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
28750 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
28760 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28770 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28780 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
28790 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
287a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
287b0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
287c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
287d0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
287e0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
287f0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
28800 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28810 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28820 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
28830 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28840 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28850 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
28860 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
28870 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
28880 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
28890 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
288a0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
288b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
288c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
288d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
288e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
288f0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
28900 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
28910 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
28920 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
28930 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
28940 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
28950 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
28960 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
28970 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
28980 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
28990 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
289a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
289b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
289c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
289d0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
289e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
289f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28a00 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
28a10 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
28a20 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
28a30 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
28a40 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
28a50 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
28a60 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
28a70 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
28a80 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
28a90 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
28aa0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
28ab0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
28ac0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
28ad0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
28ae0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
28af0 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
28b00 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
28b10 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
28b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
28b40 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
28b50 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
28b60 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
28b70 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
28b80 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
28b90 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
28ba0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
28bb0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
28bc0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
28bd0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
28be0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28bf0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
28c00 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
28c10 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
28c20 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
28c30 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
28c40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
28c50 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
28c60 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
28c70 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
28c80 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
28c90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
28ca0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
28cb0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
28cc0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
28cd0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
28ce0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
28cf0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
28d00 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
28d10 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
28d20 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
28d30 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
28d40 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
28d50 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
28d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28d70 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
28d80 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
28d90 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
28da0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
28db0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
28dc0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
28dd0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
28de0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
28df0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
28e00 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
28e10 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
28e20 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
28e30 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
28e40 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
28e50 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
28e60 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
28e70 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
28e80 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
28e90 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
28ea0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
28eb0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
28ec0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
28ed0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
28ee0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
28ef0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
28f00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
28f10 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
28f20 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
28f30 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
28f40 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
28f50 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
28f60 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
28f70 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
28f80 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
28f90 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
28fa0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
28fb0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
28fc0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
28fd0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
28fe0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
28ff0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
29000 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
29010 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
29020 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
29030 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
29040 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
29050 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
29060 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
29070 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
29080 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
29090 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
290a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
290b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
290c0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
290d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
290e0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
290f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
29100 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
29110 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
29120 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
29130 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
29140 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
29150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29170 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29180 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
29190 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
291a0 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
291b0 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
291c0 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
291d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
291e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
291f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29200 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
29210 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
29220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29230 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
29240 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
29250 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
29260 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
29270 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
29280 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
29290 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
292a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
292b0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
292c0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
292d0 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
292e0 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
292f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
29300 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
29310 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
29320 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
29330 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
29340 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29350 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
29360 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
29370 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
29380 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
29390 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
293a0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
293b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
293c0 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
293d0 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
293e0 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
293f0 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
29400 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
29410 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
29430 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
29440 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
29450 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26  =SQLITE_OK .   &
29460 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  & pPager->dbHint
29470 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
29480 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74  ize.   && (pList
29490 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73  ->pDirty || pLis
294a0 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  t->pgno>pPager->
294b0 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b  dbHintSize).  ){
294c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
294d0 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67  64 szFile = pPag
294e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28  er->pageSize * (
294f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50  sqlite3_int64)pP
29500 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
29510 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
29520 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
29530 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
29540 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26  NTL_SIZE_HINT, &
29550 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61  szFile);.    pPa
29560 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
29570 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
29580 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
29590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
295a0 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
295b0 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
295c0 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
295d0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
295e0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
295f0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
29600 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
29610 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
29620 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
29630 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
29640 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
29650 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
29660 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
29670 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
29680 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
29690 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
296a0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
296b0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
296c0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
296d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
296e0 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
296f0 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
29700 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
29710 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29720 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
29730 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
29740 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
29750 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
29760 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
29770 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
29780 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
29790 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
297a0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
297b0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
297c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
297d0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
297e0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
297f0 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29820 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
29830 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65      ..      asse
29840 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67  rt( (pList->flag
29850 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
29860 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  C)==0 );.      i
29870 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
29880 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
29890 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
298a0 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ist);..      /* 
298b0 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62  Encode the datab
298c0 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44  ase */.      COD
298d0 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
298e0 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  t->pData, pgno, 
298f0 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  6, return SQLITE
29900 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a  _NOMEM, pData);.
29910 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
29920 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
29930 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
29940 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
29950 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
29960 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
29970 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
29980 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
29990 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
299a0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
299b0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
299c0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
299d0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
299e0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
299f0 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
29a00 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
29a10 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
29a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29a30 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
29a40 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
29a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
29a60 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
29a70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
29a80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
29a90 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
29aa0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
29ab0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
29ac0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
29ad0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
29ae0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
29af0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
29b00 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
29b10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
29b20 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
29b30 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
29b40 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
29b50 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
29b60 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
29b70 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
29b80 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
29b90 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
29ba0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
29bb0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
29bc0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
29bd0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
29be0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
29bf0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
29c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29c20 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
29c30 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
29c40 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
29c50 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
29c60 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
29c70 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
29c80 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
29c90 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
29ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29cb0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
29cc0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
29cd0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
29ce0 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
29cf0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
29d00 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
29d10 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
29d20 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
29d30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
29d40 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
29d50 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
29d60 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
29d70 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
29d80 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
29d90 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
29da0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
29db0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
29dc0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
29dd0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
29de0 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
29df0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
29e00 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
29e10 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
29e20 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
29e30 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
29e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
29e50 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
29e60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29e70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29e80 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
29e90 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
29ea0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
29eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
29ec0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
29ed0 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
29ee0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
29ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29f00 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
29f10 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20  pPager->sjfd);. 
29f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29f30 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
29f40 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
29f50 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f  r->sjfd, SQLITE_
29f60 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29  OPEN_SUBJOURNAL)
29f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
29f80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29f90 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
29fa0 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
29fb0 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
29fc0 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
29fd0 75 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73  urnal. .** It is
29fe0 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73   the callers res
29ff0 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75  ponsibility to u
2a000 73 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  se subjRequiresP
2a010 61 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a  age() to check .
2a020 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65  ** that it is re
2a030 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65  ally required be
2a040 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
2a050 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2a060 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2a070 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2a080 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2a090 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2a0a0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2a0b0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2a0c0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2a0d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2a0e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a0f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2a100 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a110 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2a120 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2a130 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2a140 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2a150 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2a160 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a170 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2a180 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2a190 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2a1a0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2a1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a1c0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2a1d0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2a1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a1f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a200 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a210 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a220 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2a230 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2a240 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2a250 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a260 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2a270 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2a280 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2a290 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2a2a0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2a2b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a2c0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2a2d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a2e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2a2f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a300 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2a310 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2a320 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2a330 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2a340 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2a350 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2a360 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2a370 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2a380 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2a390 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2a3a0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2a3b0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2a3c0 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2a3d0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2a3e0 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2a3f0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2a400 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2a410 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2a420 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2a430 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a450 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2a460 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2a470 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2a480 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2a490 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2a4a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a4b0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2a4c0 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2a4d0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2a4e0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2a4f0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a500 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2a510 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a520 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2a530 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a540 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2a550 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2a560 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2a570 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2a580 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2a590 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a5a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a5b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a5c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a5d0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2a5e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a5f0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2a600 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a620 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a630 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2a640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2a650 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2a660 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2a670 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2a680 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2a690 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a6a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a6b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2a6c0 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
2a6d0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
2a6e0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
2a6f0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
2a700 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
2a710 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
2a720 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
2a730 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
2a740 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
2a750 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
2a760 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
2a770 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
2a780 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
2a790 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a7a0 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
2a7b0 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
2a7c0 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
2a7d0 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
2a7e0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2a7f0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
2a800 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
2a810 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a820 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
2a830 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
2a840 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
2a850 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
2a860 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
2a870 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
2a880 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
2a890 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
2a8a0 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
2a8b0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
2a8c0 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
2a8d0 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
2a8e0 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
2a8f0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
2a900 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
2a910 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2a920 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
2a930 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
2a940 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2a950 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2a960 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2a970 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
2a980 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
2a990 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
2a9a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2a9b0 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
2a9c0 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
2a9d0 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
2a9e0 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
2a9f0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
2aa00 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
2aa10 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2aa20 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
2aa30 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
2aa40 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
2aa50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
2aa60 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
2aa70 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
2aa80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2aa90 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
2aaa0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aab0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
2aac0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
2aad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2aae0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2aaf0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
2ab00 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53  e doNotSpill NOS
2ab10 59 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64  YNC bit is set d
2ab20 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e  uring times when
2ab30 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66   doing a sync of
2ab40 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  .  ** journal (a
2ab50 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20  nd adding a new 
2ab60 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61  header) is not a
2ab70 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63  llowed.  This oc
2ab80 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
2ab90 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2aba0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68  3PagerWrite() wh
2abb0 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f  ile trying to jo
2abc0 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20  urnal multiple. 
2abd0 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67   ** pages belong
2abe0 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ing to the same 
2abf0 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  sector..  **.  *
2ac00 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2ac10 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46   ROLLBACK and OF
2ac20 46 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20  F bits inhibits 
2ac30 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
2ac40 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65  ng.  ** regardle
2ac50 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72  ss of whether or
2ac60 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
2ac70 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
2ac80 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a  s set during.  *
2ac90 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  * a rollback or 
2aca0 62 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c  by user request,
2acb0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
2acc0 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e   **.  ** Spillin
2acd0 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62  g is also prohib
2ace0 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20  ited when in an 
2acf0 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63  error state sinc
2ad00 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a  e that could.  *
2ad10 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  * lead to databa
2ad20 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
2ad30 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   In the current 
2ad40 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69 74  implementaton it
2ad50 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2ad60 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2ad70 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2ad80 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2ad90 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2ada0 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2adb0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2adc0 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2add0 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2ade0 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2adf0 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2ae00 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2ae10 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2ae20 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2ae30 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2ae40 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2ae50 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2ae60 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2ae70 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2ae80 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2ae90 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2aea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2aeb0 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2aec0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2aed0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2aee0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2aef0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2af00 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2af10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2af20 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2af30 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2af40 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2af50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2af60 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2af70 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2af80 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2af90 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2afa0 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2afb0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2afc0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2afd0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2afe0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2aff0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
2b000 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
2b010 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
2b020 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
2b030 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
2b040 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
2b050 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
2b060 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
2b070 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
2b080 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2b090 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
2b0a0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0c0 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
2b0d0 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
2b0e0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
2b0f0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
2b100 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2b110 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2b120 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2b130 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2b140 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2b150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2b160 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2b170 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2b180 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2b190 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2b1a0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2b1b0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
2b1c0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
2b1d0 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
2b1e0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
2b1f0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
2b200 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
2b210 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
2b220 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
2b230 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
2b240 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
2b250 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
2b260 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
2b270 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
2b280 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
2b290 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
2b2a0 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
2b2b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2b2c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
2b2d0 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
2b2e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
2b2f0 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
2b300 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
2b310 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
2b320 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
2b330 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
2b340 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2b350 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
2b360 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
2b370 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
2b380 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
2b390 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
2b3a0 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
2b3b0 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
2b3c0 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
2b3d0 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
2b3e0 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
2b3f0 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
2b400 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
2b410 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
2b420 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
2b430 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
2b440 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
2b450 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
2b460 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
2b470 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
2b480 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
2b490 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
2b4a0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
2b4b0 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
2b4c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2b4d0 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
2b4e0 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
2b4f0 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
2b500 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
2b510 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
2b520 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
2b530 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
2b540 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
2b550 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
2b560 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
2b570 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
2b580 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
2b590 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
2b5a0 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
2b5b0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2b5c0 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
2b5d0 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
2b5e0 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
2b5f0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
2b600 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
2b610 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
2b620 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
2b630 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
2b640 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
2b650 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
2b660 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
2b670 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
2b680 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
2b690 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
2b6a0 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
2b6b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b6c0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2b6d0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
2b6e0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
2b6f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2b700 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
2b710 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2b720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2b740 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
2b750 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2b760 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
2b770 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
2b780 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
2b790 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
2b7a0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
2b7b0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
2b7c0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2b7d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
2b7e0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
2b7f0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
2b800 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b810 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2b820 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
2b830 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
2b840 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
2b850 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2b860 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
2b870 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b880 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2b890 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2b8a0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2b8b0 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2b8c0 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2b8d0 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2b8e0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2b8f0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2b900 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2b910 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2b920 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2b930 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2b940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b950 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2b960 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2b970 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2b980 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2b990 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2b9a0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2b9b0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2b9c0 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2b9d0 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2b9e0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2b9f0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2ba00 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2ba10 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2ba20 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2ba30 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2ba40 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2ba50 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2ba60 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2ba70 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2ba80 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2ba90 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2baa0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2bab0 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2bac0 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2bad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2bae0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2baf0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2bb00 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2bb10 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2bb20 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bb30 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bb40 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bb50 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bb60 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2bb70 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bb80 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bb90 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bba0 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bbb0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bbc0 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bbd0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bbe0 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bbf0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bc00 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bc10 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bc20 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2bc30 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2bc40 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2bc50 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2bc60 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2bc70 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2bc80 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2bc90 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2bca0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2bcb0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2bcc0 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2bcd0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2bce0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2bcf0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bd00 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2bd10 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2bd20 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2bd30 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2bd40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2bd50 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2bd60 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2bd70 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2bd80 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2bd90 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2bda0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2bdb0 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2bdc0 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2bdd0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2bde0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2bdf0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2be00 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2be10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2be20 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2be30 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2be40 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2be50 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2be60 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2be70 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2be80 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2be90 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2bea0 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2beb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2bec0 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2bed0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bee0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2bef0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2bf00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2bf10 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2bf20 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2bf30 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2bf40 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2bf50 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2bf60 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2bf70 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2bf80 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2bf90 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2bfa0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2bfb0 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2bfc0 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2bfd0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2bfe0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2bff0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c000 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c010 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c020 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c030 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c040 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c050 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c060 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c070 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c080 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c090 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c0a0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c0b0 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c0c0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c0d0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c0e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c0f0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c100 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c110 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c120 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c130 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c140 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c150 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c160 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c170 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c180 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c190 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c1a0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c1b0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c1c0 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c1d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c1e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c1f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c200 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c210 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c220 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c230 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c240 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c250 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c260 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c270 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c280 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c290 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c2a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c2b0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c2c0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c2d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c2e0 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c2f0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c310 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c320 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c330 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c340 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c350 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c360 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c370 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c380 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c390 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c3a0 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c3b0 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c3c0 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c3d0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c3e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c3f0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c400 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2c410 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2c420 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2c430 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2c440 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c450 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2c460 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2c470 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2c480 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2c490 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2c4a0 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2c4b0 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2c4c0 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2c4d0 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2c4e0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2c4f0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2c500 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2c510 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2c520 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2c530 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2c540 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2c550 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2c560 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2c570 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c580 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2c590 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c5a0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2c5b0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c5c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c5d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c5e0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c5f0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c600 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2c610 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2c620 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2c630 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2c640 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2c650 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2c660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2c670 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2c680 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2c690 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2c6a0 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2c6b0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c6c0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2c6d0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c6e0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2c6f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c700 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c710 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2c720 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e  E_NOMEM;.      n
2c730 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c740 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c750 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2c760 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2c770 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c780 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2c790 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2c7a0 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2c7b0 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2c7c0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2c7d0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2c7e0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2c7f0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2c800 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2c810 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2c820 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2c830 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2c840 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2c850 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c860 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2c870 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2c880 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2c890 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2c8a0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c8b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2c8c0 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2c8d0 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2c8e0 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2c8f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c900 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2c910 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2c920 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2c930 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2c940 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2c950 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2c960 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2c970 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2c980 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2c990 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2c9a0 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2c9b0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2c9c0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2c9d0 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2c9e0 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2c9f0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2ca00 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2ca10 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2ca20 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2ca30 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2ca40 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2ca50 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2ca60 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2ca70 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2ca80 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2ca90 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2caa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cab0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2cac0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2cad0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2cae0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2caf0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2cb00 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2cb10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2cb20 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2cb30 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2cb40 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2cb50 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2cb60 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2cb70 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2cb80 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2cb90 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2cba0 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2cbb0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2cbc0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2cbd0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2cbe0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2cbf0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2cc00 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2cc10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2cc20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2cc30 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2cc40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cc50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cc60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cc70 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cc80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cc90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2cca0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2ccb0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2ccc0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2ccd0 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2cce0 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2ccf0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2cd00 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2cd10 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2cd20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2cd30 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2cd40 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2cd50 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2cd60 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd80 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2cd90 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2cda0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cdc0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2cdd0 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2cde0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2cdf0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ce00 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2ce10 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2ce20 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2ce30 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2ce40 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2ce50 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2ce60 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2ce70 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2ce80 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2ce90 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2cea0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2ceb0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2cec0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2ced0 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2cee0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2cef0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2cf00 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2cf10 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2cf20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2cf30 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2cf40 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2cf50 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2cf60 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2cf70 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2cf80 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2cf90 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2cfa0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2cfb0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2cfc0 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2cfd0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2cfe0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2cff0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d000 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d010 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d020 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d030 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d040 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d050 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d060 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d070 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d080 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d090 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d0a0 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d0b0 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d0d0 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d0e0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d0f0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d100 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d110 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d120 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d130 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d140 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d150 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d160 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d170 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2d180 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2d190 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2d1a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2d1b0 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2d1c0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2d1d0 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2d1e0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2d1f0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d200 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d210 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2d220 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2d230 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d240 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2d250 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2d260 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2d270 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d280 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d290 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2d2a0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2d2b0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2d2c0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2d2d0 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2d2e0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d2f0 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2d300 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2d310 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2d320 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2d330 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2d340 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2d350 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2d360 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2d370 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2d380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2d390 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2d3a0 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2d3b0 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2d3c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d3d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2d3e0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d3f0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2d400 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2d410 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2d420 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2d430 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2d440 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2d450 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2d460 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d470 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d480 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d490 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2d4a0 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2d4b0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d4c0 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d4d0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d4e0 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2d4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2d500 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2d510 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2d520 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d530 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2d540 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2d550 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d560 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d570 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2d580 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2d590 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2d5a0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d5b0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d5c0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d5d0 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2d5e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d5f0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d600 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2d610 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2d620 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2d630 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2d640 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2d650 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2d660 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d670 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d680 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2d690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6a0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2d6b0 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2d6c0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2d6d0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2d6e0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2d6f0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2d700 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2d710 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2d720 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2d730 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2d740 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d750 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2d760 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2d770 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2d780 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d790 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2d7a0 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2d7b0 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2d7c0 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2d7d0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2d7e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2d7f0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2d800 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2d810 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2d820 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2d830 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d840 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2d850 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2d860 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2d870 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2d880 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2d890 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2d8a0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2d8b0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2d8c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d8e0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2d8f0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2d900 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2d910 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2d920 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b  if( !readOnly ){
2d930 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74  .        setSect
2d940 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2d950 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2d960 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2d970 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2d980 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2d990 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
2d9a0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2d9b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2d9c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
2d9d0 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2d9e0 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2d9f0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2da00 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2da10 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2da20 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2da30 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2da40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2da50 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2da60 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2da70 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2da80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2da90 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2daa0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2dab0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
2dac0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2dad0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
2dae0 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2daf0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2db00 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2db10 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2db20 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2db30 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2db40 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2db50 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2db60 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2db70 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
2db80 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2db90 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2dba0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dbb0 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2dbc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2dbd0 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2dbe0 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2dbf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dc00 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2dc10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2dc20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dc30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dc40 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2dc50 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69  r->noLock = sqli
2dc60 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2dc70 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f  zFilename, "nolo
2dc80 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ck", 0);.      i
2dc90 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45  f( (iDc & SQLITE
2dca0 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
2dcb0 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )!=0.       || s
2dcc0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2dcd0 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69  an(zFilename, "i
2dce0 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b  mmutable", 0) ){
2dcf0 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c  .          vfsFl
2dd00 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2dd10 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2dd20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f         goto act_
2dd30 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a  like_temp_file;.
2dd40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dd50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2dd60 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2dd70 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2dd80 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2dd90 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2dda0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2ddb0 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2ddc0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2ddd0 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2dde0 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2ddf0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2de00 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2de10 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2de20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2de30 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2de40 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2de50 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2de60 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2de70 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2de80 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2de90 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2dea0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2deb0 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2dec0 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2ded0 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2dee0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a   journal..    **
2def0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2df00 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f  nch also runs fo
2df10 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61  r files marked a
2df20 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20  s immutable..   
2df30 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65   */ .act_like_te
2df40 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d  mp_file:.    tem
2df50 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2df60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2df70 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20  PAGER_READER;   
2df80 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2df90 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
2dfa0 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ock */.    pPage
2dfb0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2dfc0 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a  SIVE_LOCK;    /*
2dfd0 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20   Pretend we are 
2dfe0 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  in EXCLUSIVE loc
2dff0 6b 69 6e 67 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  king mode */.   
2e000 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2e010 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2e020 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63      /* Do no loc
2e030 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64  king */.    read
2e040 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
2e050 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
2e060 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
2e070 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e080 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
2e090 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
2e0a0 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
2e0b0 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
2e0c0 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
2e0d0 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
2e0e0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
2e0f0 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
2e100 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e110 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e120 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
2e130 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e140 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
2e150 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
2e160 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
2e170 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
2e180 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
2e190 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
2e1a0 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
2e1b0 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ect. */.  if( rc
2e1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e1d0 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2e1e0 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45  a<1000 );.    nE
2e1f0 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2e200 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20  xtra);.    rc = 
2e210 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2e220 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2e230 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e250 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2e260 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2e270 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2e280 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2e2a0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2e2b0 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2e2c0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e2d0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2e2e0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2e2f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e300 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2e310 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2e320 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2e330 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2e340 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2e350 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2e360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2e370 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2e380 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e390 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2e3a0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2e3b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e3c0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2e3d0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2e3e0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2e3f0 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2e400 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e410 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2e420 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2e430 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2e440 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e450 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2e460 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2e470 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2e480 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2e490 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e4a0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2e4b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e4c0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2e4d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2e4e0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2e4f0 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2e500 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2e510 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2e520 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2e530 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2e540 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e550 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e560 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2e570 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e580 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2e590 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2e5a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e5b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e5c0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e5d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e5e0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2e5f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2e600 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2e610 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2e620 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2e630 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2e640 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2e650 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2e660 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2e670 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2e680 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2e690 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2e6a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e6b0 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2e6c0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2e6d0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2e6e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
2e6f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
2e700 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
2e710 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
2e720 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53  ->noSync ? 0 : S
2e730 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2e740 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  L;.  pPager->ckp
2e750 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  tSyncFlags = pPa
2e760 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
2e770 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2e780 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2e790 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2e7a0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2e7b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2e7c0 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2e7d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e7e0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
2e7f0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e800 28 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79  ( pPager->ckptSy
2e810 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e820 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
2e830 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b  r->fullSync = 1;
2e840 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
2e850 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2e860 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
2e870 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2e880 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e890 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c  YNC_NORMAL | WAL
2e8a0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
2e8b0 4e 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  NS;.    pPager->
2e8c0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
2e8d0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2e8e0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  AL;.  }.  /* pPa
2e8f0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
2e900 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e910 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
2e920 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e930 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
2e940 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
2e950 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
2e960 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
2e970 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
2e980 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
2e990 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
2e9a0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2e9b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
2e9c0 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
2e9d0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2e9e0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
2e9f0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
2ea00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2ea10 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2ea20 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
2ea30 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
2ea40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ea50 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2ea60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
2ea70 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
2ea80 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
2ea90 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
2eaa0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
2eab0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
2eac0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
2ead0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
2eae0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2eaf0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2eb00 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2eb10 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2eb20 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2eb30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2eb40 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2eb50 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2eb60 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2eb70 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2eb80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2eb90 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
2eba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ebb0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
2ebc0 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
2ebd0 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
2ebe0 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
2ebf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2ec00 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2ec10 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
2ec20 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
2ec30 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
2ec40 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
2ec50 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2ec60 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
2ec70 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
2ec80 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
2ec90 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
2eca0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
2ecb0 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
2ecc0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
2ecd0 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
2ece0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
2ecf0 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2ed00 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
2ed10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2ed20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ed30 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
2ed40 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
2ed50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ed60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2ed70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
2ed80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ed90 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
2eda0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2edb0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
2edc0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
2edd0 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
2ede0 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2edf0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
2ee00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
2ee10 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
2ee20 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
2ee30 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
2ee40 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
2ee50 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
2ee60 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
2ee70 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
2ee80 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
2ee90 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
2eea0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
2eeb0 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
2eec0 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
2eed0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2eee0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2eef0 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
2ef00 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
2ef10 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2ef20 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
2ef30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2ef40 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2ef50 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2ef60 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2ef70 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2ef80 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2ef90 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2efa0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2efb0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2efc0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2efd0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2efe0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2eff0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2f000 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2f010 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2f020 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2f030 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f040 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2f050 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2f060 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2f070 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2f080 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2f090 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f0a0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2f0b0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2f0c0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2f0d0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2f0e0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2f0f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2f100 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2f110 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2f120 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2f130 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2f140 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2f150 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2f160 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2f170 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f180 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2f190 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2f1a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2f1b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f1c0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2f1d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2f1e0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2f1f0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2f200 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2f210 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2f220 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2f230 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2f240 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2f250 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2f260 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2f270 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2f280 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2f290 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2f2a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2f2b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f2c0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2f2d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2f2e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2f2f0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2f300 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2f310 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2f320 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2f330 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2f340 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2f350 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2f360 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f370 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2f380 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2f390 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2f3a0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2f3b0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2f3c0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2f3d0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2f3e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2f3f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2f400 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2f410 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2f420 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2f430 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2f440 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2f450 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2f460 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2f470 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2f480 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2f490 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f4a0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2f4b0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2f4c0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2f4d0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2f4e0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2f4f0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2f500 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2f510 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2f520 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2f530 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2f540 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2f550 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2f560 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2f570 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2f580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2f590 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2f5a0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2f5b0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2f5c0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2f5d0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2f5e0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2f5f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2f600 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2f610 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2f620 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2f630 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f640 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2f650 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2f660 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2f670 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2f680 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2f690 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2f6a0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
2f6b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2f6c0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
2f6d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2f6e0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2f6f0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
2f700 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
2f710 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2f720 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2f730 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
2f740 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
2f750 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
2f760 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
2f770 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
2f780 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2f790 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
2f7a0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
2f7b0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
2f7c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
2f7d0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
2f7e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f7f0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
2f800 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
2f810 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f820 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
2f830 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
2f840 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2f850 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
2f860 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
2f870 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
2f880 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
2f890 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
2f8a0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
2f8b0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
2f8c0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
2f8d0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
2f8e0 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
2f8f0 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
2f900 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
2f910 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
2f920 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
2f930 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
2f940 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2f950 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2f960 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
2f970 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
2f980 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
2f990 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
2f9a0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
2f9b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
2f9c0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
2f9d0 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
2f9e0 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
2f9f0 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
2fa00 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
2fa10 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
2fa20 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
2fa30 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
2fa40 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
2fa50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2fa60 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2fa70 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
2fa80 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
2fa90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2faa0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
2fab0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
2fac0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2fad0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2fae0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
2faf0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
2fb00 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
2fb10 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
2fb20 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2fb30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2fb40 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2fb50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a  he database is z
2fb60 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a  ero pages in siz
2fb70 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  e, that means th
2fb80 61 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68  at either (1) th
2fb90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
2fba0 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e  rnal is a remnan
2fbb0 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64  t from a prior d
2fbc0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
2fbd0 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65   same name where
2fbe0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2fbf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75  database file bu
2fc00 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  t not the journa
2fc10 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f  l was deleted, o
2fc20 72 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61  r (2) the initia
2fc30 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  l.        ** tra
2fc40 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f  nsaction that po
2fc50 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61  pulates a new da
2fc60 74 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20  tabase is being 
2fc70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
2fc80 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65       ** In eithe
2fc90 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72  r case, the jour
2fca0 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20  nal file can be 
2fcb0 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65  deleted.  Howeve
2fcc0 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20  r, take care.   
2fcd0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64       ** not to d
2fce0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2fcf0 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
2fd00 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65  already open due
2fd10 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a   to.        ** j
2fd20 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53  ournal_mode=PERS
2fd30 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  IST..        */.
2fd40 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2fd50 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65  e==0 && !jrnlOpe
2fd60 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
2fd70 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
2fd80 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
2fd90 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f       if( pagerLo
2fda0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53  ckDb(pPager, RES
2fdb0 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c  ERVED_LOCK)==SQL
2fdc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
2fde0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
2fdf0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
2fe00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2fe10 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
2fe20 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72  siveMode ) pager
2fe30 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
2fe40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
2fe50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe60 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
2fe70 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2fe80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fe90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a          /* The j
2fea0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2feb0 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
2fec0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
2fed0 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20   reserved.      
2fee0 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65      ** or greate
2fef0 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
2ff00 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77  tabase file. Now
2ff10 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   check that ther
2ff20 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  e is.          *
2ff30 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e  * at least one n
2ff40 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74  on-zero bytes at
2ff50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2ff60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2ff70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2ff80 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77  there is, then w
2ff90 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  e consider this 
2ffa0 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f  journal to be ho
2ffb0 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20  t. If not, .    
2ffc0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
2ffd0 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
2ffe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2fff0 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e     if( !jrnlOpen
30000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30010 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c  int f = .#if SQL
30020 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
30030 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
30040 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
30050 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
30060 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
30070 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
30080 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
30090 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
300a0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
300b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
300c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
300d0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
300e0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
300f0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
30100 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20  jfd, f, &f);.   
30110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
30130 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30140 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30      u8 first = 0
30150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30160 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
30170 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76  (pPager->jfd, (v
30180 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c  oid *)&first, 1,
30190 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
301a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
301b0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
301c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
301d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
301e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
301f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30200 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
30210 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30220 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
30230 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
30240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30250 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
30260 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
30270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
30280 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
30290 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
302a0 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
302b0 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
302c0 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
302d0 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
302e0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
302f0 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
30300 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
30310 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
30320 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
30330 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30340 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
30350 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
30360 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
30370 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
30380 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
30390 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
303a0 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
303b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
303c0 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
303d0 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
303e0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
303f0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
30400 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30410 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
30420 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
30430 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
30440 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
30450 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
30460 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
30470 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
30480 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
30490 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
304a0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
304b0 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
304c0 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
304d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
304e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
304f0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30500 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30510 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30520 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30530 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
30540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30550 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30560 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
30570 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
30580 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30590 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
305a0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
305b0 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
305c0 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
305d0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
305e0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
305f0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30600 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30610 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30620 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30630 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30640 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30650 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30660 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30670 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
30680 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
30690 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
306a0 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
306b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
306c0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
306d0 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
306e0 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
306f0 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30700 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30710 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30720 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30730 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30740 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30750 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30760 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30770 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
30780 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30790 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
307a0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
307b0 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
307c0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
307d0 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
307e0 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
307f0 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30800 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30810 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30820 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30830 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30840 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30850 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30870 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
30880 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30890 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
308a0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
308b0 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
308c0 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
308d0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
308e0 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
308f0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30900 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30910 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30920 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
30930 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
30940 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
30950 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
30960 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
30970 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
30980 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
30990 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
309a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
309b0 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
309c0 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
309d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
309e0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
309f0 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30a00 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30a10 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30a20 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
30a30 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
30a40 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
30a50 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
30a60 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
30a70 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
30a80 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
30a90 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30aa0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30ab0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30ad0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30ae0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30b10 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30b20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
30b30 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
30b40 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
30b50 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
30b60 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
30b70 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
30b80 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30b90 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30ba0 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30bb0 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30bc0 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30bd0 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30be0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30bf0 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30c00 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30c10 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30c20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30c30 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30c40 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30c50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30c60 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30c70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30c80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30c90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30ca0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30cb0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
30cc0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
30cd0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30ce0 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30cf0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30d00 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30d10 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30d20 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30d30 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30d40 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30d50 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30d60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30d70 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
30d80 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
30d90 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
30da0 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
30db0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
30dc0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
30dd0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30de0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30df0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30e00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30e10 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30e20 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30e30 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30e40 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30e50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30e60 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30e70 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
30e80 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
30e90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
30ea0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30eb0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
30ec0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
30ed0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30ee0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30ef0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30f00 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30f10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30f20 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30f30 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30f40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30f60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
30f70 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
30f80 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
30f90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
30fa0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
30fb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30fc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30fd0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30fe0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30ff0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
31000 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
31010 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31020 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
31030 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
31040 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
31050 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
31060 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
31070 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
31080 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
31090 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
310a0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
310b0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
310c0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
310d0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
310e0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
310f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
31100 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
31110 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31120 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
31130 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
31140 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
31150 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
31160 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
31170 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
31180 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
31190 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
311a0 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
311b0 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
311c0 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
311d0 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
311e0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
311f0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31200 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31210 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31220 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
31230 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
31240 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
31250 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
31260 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
31270 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
31280 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31290 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
312a0 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
312b0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
312c0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
312d0 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
312e0 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
312f0 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31300 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31310 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31320 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
31330 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
31340 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
31350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
31370 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
31380 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
31390 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
313a0 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
313b0 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
313c0 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
313d0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
313e0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
313f0 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31400 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31410 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31420 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
31430 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
31440 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
31450 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
31460 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
31470 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
31480 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
31490 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
314a0 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
314b0 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
314c0 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
314d0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
314e0 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
314f0 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31500 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31510 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31520 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
31530 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
31540 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31550 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
31560 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
31570 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
31580 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
31590 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
315a0 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
315b0 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
315c0 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
315d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
315e0 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
315f0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31600 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31610 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31620 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
31630 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
31640 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
31650 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
31660 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
31670 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
31680 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
31690 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
316a0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
316b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
316c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
316d0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
316e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
316f0 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31700 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31710 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31720 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
31730 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
31740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
31750 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
31760 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
31770 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
31780 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31790 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
317a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
317b0 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
317c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
317d0 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
317e0 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23        int f = .#
317f0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
31800 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
31810 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
31820 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
31830 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
31840 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
31850 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
31860 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
31870 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
31880 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
31890 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
318a0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
318b0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
318c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
318d0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
318e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
318f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
31900 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
31910 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31920 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
31930 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
31940 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
31950 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31960 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
31970 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
31980 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
31990 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
319a0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
319b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
319c0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
319d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
319e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
319f0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
31a00 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
31a10 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
31a20 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
31a30 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
31a40 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
31a50 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
31a60 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
31a70 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
31a80 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
31a90 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
31aa0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
31ab0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
31ac0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
31ad0 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
31ae0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
31af0 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
31b00 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
31b10 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
31b20 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
31b30 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
31b40 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
31b50 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
31b60 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
31b70 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
31b80 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
31b90 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
31ba0 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
31bb0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
31bc0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
31bd0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
31be0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
31c00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
31c10 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
31c20 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
31c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31c50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
31c60 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
31c70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
31c80 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
31c90 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
31ca0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
31cb0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
31cc0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
31cd0 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
31ce0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
31cf0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
31d00 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
31d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31d20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
31d30 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
31d40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
31d50 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
31d60 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
31d70 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
31d80 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
31d90 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
31da0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
31db0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
31dc0 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
31dd0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
31de0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
31df0 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
31e00 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
31e10 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
31e20 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
31e30 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
31e40 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
31e50 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
31e60 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
31e70 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
31e80 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
31e90 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
31ea0 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
31eb0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
31ec0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
31ed0 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
31ee0 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
31ef0 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
31f00 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
31f10 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
31f20 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
31f30 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
31f40 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
31f50 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
31f60 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
31f70 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
31f80 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
31f90 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
31fa0 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
31fb0 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
31fc0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
31fd0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
31fe0 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
31ff0 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
32000 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
32010 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
32020 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
32030 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
32040 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
32050 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
32060 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
32070 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
32080 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
32090 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
320a0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
320b0 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
320c0 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
320d0 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
320e0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
320f0 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
32100 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32110 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32120 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
32130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32140 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32150 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
32160 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
32170 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
32180 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
32190 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
321a0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
321b0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
321c0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
321d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
321e0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
321f0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 70  e && (.        p
32200 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a  Pager->pBackup .
32210 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
32220 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
32230 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
32240 30 20 0a 20 20 20 20 20 7c 7c 20 55 53 45 46 45  0 .     || USEFE
32250 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 20  TCH(pPager).    
32260 29 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  )){.      /* The
32270 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
32280 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
32290 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
322a0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
322b0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
322c0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
322d0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
322e0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
322f0 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
32300 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
32310 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
32320 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
32330 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
32340 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
32350 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
32360 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
32370 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
32380 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
32390 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
323a0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
323b0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
323c0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
323d0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
323e0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
323f0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
32400 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
32410 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
32420 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
32430 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
32440 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
32450 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
32460 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
32470 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
32480 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
32490 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
324a0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
324b0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
324c0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
324d0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
324e0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
324f0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
32500 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
32510 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
32520 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
32530 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
32540 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
32550 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
32560 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
32570 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
32580 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
32590 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
325a0 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
325b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
325c0 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
325d0 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
325e0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
325f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32600 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
32610 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
32620 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
32630 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
32640 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
32650 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32660 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
32670 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
32680 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
32690 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
326a0 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
326b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
326c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
326d0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
326e0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
326f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
32700 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
32710 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32720 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
32730 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
32740 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
32750 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32760 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
32770 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
32780 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
32790 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
327a0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
327b0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
327c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61  .        /* Unma
327d0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  p the database f
327e0 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69  ile. It is possi
327f0 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61  ble that externa
32800 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20  l processes.    
32810 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20      ** may have 
32820 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61  truncated the da
32830 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
32840 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74  then extended it
32850 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a   back.        **
32860 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
32870 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73   size while this
32880 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74   process was not
32890 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e   holding a lock.
328a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
328b0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d  his case there m
328c0 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72  ay exist a Pager
328d0 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68  .pMap mapping th
328e0 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  at appears.     
328f0 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20     ** to be the 
32900 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69  right size but i
32910 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76  s not actually v
32920 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73  alid. Avoid this
32930 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
32940 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70  ibility by unmap
32950 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65  ping the db here
32960 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
32970 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
32980 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
32990 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
329a0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
329b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
329c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
329d0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
329e0 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
329f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
32a00 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
32a10 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
32a20 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
32a30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
32a40 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
32a50 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
32a60 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
32a70 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
32a80 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
32a90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
32aa0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32ab0 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
32ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
32ad0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
32ae0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32af0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
32b00 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
32b10 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
32b20 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
32b30 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
32b40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
32b50 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32b60 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
32b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
32b80 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
32b90 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
32ba0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
32bb0 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
32bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32bd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
32be0 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
32bf0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
32c00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32c10 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32c20 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
32c30 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
32c40 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32c50 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65  READER;.  }.  re
32c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32c70 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
32c80 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
32c90 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
32ca0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
32cb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
32cc0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
32cd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
32ce0 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
32cf0 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
32d00 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
32d10 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
32d20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
32d30 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
32d40 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
32d50 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
32d60 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
32d70 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
32d80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
32d90 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
32da0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
32db0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
32dc0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
32dd0 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28  nMmapOut==0 && (
32de0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
32df0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
32e00 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20  Cache)==0) ){.  
32e10 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
32e20 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
32e30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
32e40 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
32e50 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
32e60 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
32e70 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
32e80 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
32e90 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
32ea0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
32eb0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
32ec0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
32ed0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
32ee0 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
32ef0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
32f00 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
32f10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
32f20 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
32f30 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
32f40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
32f50 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
32f60 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
32f70 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
32f80 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
32f90 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
32fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32fb0 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
32fc0 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
32fd0 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
32fe0 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
32ff0 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
33000 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
33010 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
33020 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
33030 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
33040 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
33050 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
33060 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
33070 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
33080 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
33090 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
330a0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
330b0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
330c0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
330d0 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
330e0 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
330f0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
33100 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
33110 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
33120 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
33130 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
33140 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
33150 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
33160 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
33170 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
33180 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
33190 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
331a0 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
331b0 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
331c0 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
331d0 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
331e0 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
331f0 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
33200 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
33210 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
33220 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
33230 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
33240 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
33250 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
33260 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
33270 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
33280 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
33290 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
332a0 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
332b0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
332c0 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
332d0 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
332e0 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
332f0 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  urs in two scena
33300 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
33310 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
33320 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
33330 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
33340 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
33350 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
33360 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
33370 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
33380 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
33390 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
333a0 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
333b0 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
333c0 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
333d0 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
333e0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
333f0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
33400 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
33410 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20  , then the data 
33420 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f  returned is zero
33430 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
33440 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d   being read from
33450 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
33460 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
33470 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64   bits correspond
33480 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69  ing.** to pgno i
33490 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
334a0 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61  al (bitvec of pa
334b0 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74  ges already writ
334c0 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f  ten to the.** jo
334d0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
334e0 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
334f0 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
33500 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f  bitvecs of any o
33510 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  pen.** savepoint
33520 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20  s are set. This 
33530 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67  means if the pag
33540 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62  e is made writab
33550 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69  le at any.** poi
33560 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
33570 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74  , using a call t
33580 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
33590 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65  ite(), its conte
335a0 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nts.** will not 
335b0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68  be journaled. Th
335c0 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a  is saves IO..**.
335d0 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
335e0 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
335f0 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
33600 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
33610 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
33620 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
33630 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
33640 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
33650 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
33660 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
33670 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
33680 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
33690 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
336a0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
336b0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
336c0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
336d0 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
336e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
336f0 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
33700 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
33710 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
33720 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
33730 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
33740 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
33750 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
33760 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
33770 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
33780 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
33790 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
337a0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
337b0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
337c0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
337d0 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
337e0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
337f0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
33800 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
33810 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
33820 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
33830 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
33840 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
33850 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
33860 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
33870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33880 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
33890 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
338a0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
338b0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
338c0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
338d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
338e0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
338f0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
33900 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
33910 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
33920 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
33930 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
33940 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20  *pPg = 0;.  u32 
33950 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  iFrame = 0;     
33960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33970 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f  rame to read fro
33980 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20  m WAL file */.  
33990 63 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74  const int noCont
339a0 65 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ent = (flags & P
339b0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
339c0 4e 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  NT);..  /* It is
339d0 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75   acceptable to u
339e0 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28  se a read-only (
339f0 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61  mmap) page for a
33a00 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20  ny page except. 
33a10 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68   ** page 1 if th
33a20 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d  ere is no write-
33a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
33a40 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f   or the ACQUIRE_
33a50 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c  READONLY.  ** fl
33a60 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64  ag was specified
33a70 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
33a80 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74  And so long as t
33a90 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a  he db is not a .
33aa0 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f    ** temporary o
33ab0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
33ac0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73  base.  */.  cons
33ad0 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20  t int bMmapOk = 
33ae0 28 70 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46  (pgno!=1 && USEF
33af0 45 54 43 48 28 70 50 61 67 65 72 29 0a 20 20 20  ETCH(pPager).   
33b00 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
33b10 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
33b20 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47   || (flags & PAG
33b30 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29  ER_GET_READONLY)
33b40 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
33b50 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
33b60 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
33b70 30 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20  0.#endif.  );.. 
33b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33b90 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
33ba0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
33bb0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
33bc0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
33bd0 0a 20 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e  .  assert( noCon
33be0 74 65 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70  tent==0 || bMmap
33bf0 4f 6b 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Ok==0 );..  if( 
33c00 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
33c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
33c20 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
33c30 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
33c40 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
33c50 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20  r state, return 
33c60 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61  an error immedia
33c70 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  tely. .  ** Othe
33c80 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74  rwise, request t
33c90 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
33ca0 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a   PCache layer. *
33cb0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
33cc0 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
33cd0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
33ce0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
33cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
33d00 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65   bMmapOk && page
33d10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
33d20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
33d30 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
33d40 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
33d50 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
33d60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
33d70 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
33d80 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
33d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33da0 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
33db0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  me==0 ){.      v
33dc0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
33dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33de0 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
33df0 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
33e00 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20    (i64)(pgno-1) 
33e10 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  * pPager->pageSi
33e20 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ze, pPager->page
33e30 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20  Size, &pData.   
33e40 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28     );..      if(
33e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33e60 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  & pData ){.     
33e70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
33e80 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44  State>PAGER_READ
33e90 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ER ){.          
33ea0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
33eb0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
33ec0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
33ed0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
33ee0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
33ef0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
33f00 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
33f10 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
33f20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  &pPg);.        }
33f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33f40 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
33f50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
33f60 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
33f70 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
33f80 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ta);.        }. 
33f90 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29         if( pPg )
33fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
33fb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33fc0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  K );.          *
33fd0 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
33fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
33ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
34000 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
34030 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34040 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34050 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20     }..    {.    
34060 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65    sqlite3_pcache
34070 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20  _page *pBase;.  
34080 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69      pBase = sqli
34090 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
340a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
340b0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
340c0 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a  if( pBase==0 ){.
340d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
340e0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53  ite3PcacheFetchS
340f0 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50  tress(pPager->pP
34100 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42  Cache, pgno, &pB
34110 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ase);.        if
34120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34130 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34140 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34150 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70  }.      pPg = *p
34160 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
34170 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
34180 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34190 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a  , pgno, pBase);.
341a0 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30        if( pPg==0
341b0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
341c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
341d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
341e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
341f0 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
34200 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
34210 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
34220 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
34230 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
34240 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34250 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
34260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
34270 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
34280 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
34290 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
342a0 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
342b0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
342c0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
342d0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
342e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
342f0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
34300 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
34310 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
34320 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
34330 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
34340 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
34350 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
34360 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
34370 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
34380 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
34390 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
343a0 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
343b0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
343c0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
343d0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
343e0 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
343f0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
34400 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
34410 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34420 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50  Pager) );.    pP
34430 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45  ager->aStat[PAGE
34440 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20  R_STAT_HIT]++;. 
34450 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34460 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
34470 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
34480 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
34490 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
344a0 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
344b0 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
344c0 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a  itialized.  */..
344d0 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67      pPg = *ppPag
344e0 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  e;.    pPg->pPag
344f0 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
34500 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
34510 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
34520 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
34530 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
34540 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
34550 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
34560 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
34570 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
34580 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
34590 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
345a0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
345b0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
345c0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
345d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
345e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
345f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
34600 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34610 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
34620 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
34630 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
34640 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
34650 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
34660 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
34670 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
34680 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34690 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
346a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
346b0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
346c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
346d0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
346e0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
346f0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
34700 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
34710 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
34720 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
34730 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
34740 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
34750 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
34760 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
34770 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
34780 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
34790 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
347a0 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
347b0 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
347c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
347d0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
347e0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
347f0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
34800 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
34810 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
34820 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
34830 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34840 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
34850 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
34860 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
34870 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
34880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
34890 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
348a0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
348b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
348c0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
348d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
348e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
348f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34900 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34910 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
34920 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34930 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
34940 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
34950 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
34960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
34980 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
34990 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
349a0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
349b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
349c0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
349d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
349e0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
349f0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  se{.      if( pa
34a00 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34a10 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  ) && bMmapOk==0 
34a20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34a30 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
34a40 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
34a50 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
34a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
34a80 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34a90 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
34aa0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
34ab0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
34ac0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
34ad0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
34ae0 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
34af0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
34b00 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
34b10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34b30 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34b40 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34b50 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
34b60 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
34b70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
34b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
34b90 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34ba0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
34bb0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
34bc0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
34bd0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
34be0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
34bf0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
34c00 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
34c10 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
34c20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
34c30 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
34c40 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
34c50 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
34c60 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
34c70 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
34c80 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
34c90 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
34ca0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
34cb0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
34cc0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
34cd0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
34ce0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
34cf0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
34d00 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
34d10 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
34d20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
34d30 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
34d40 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
34d50 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
34d60 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
34d70 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
34d80 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
34d90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
34da0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
34db0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34dc0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
34dd0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
34de0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
34df0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
34e00 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
34e10 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
34e20 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
34e30 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
34e40 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
34e50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
34e60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34e70 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
34e80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
34e90 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
34ea0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
34eb0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34ec0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
34ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
34ee0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
34ef0 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
34f00 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67  ache, pgno, pPag
34f10 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  e);.}../*.** Rel
34f20 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
34f30 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
34f40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
34f50 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
34f60 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
34f70 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
34f80 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
34f90 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
34fa0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
34fb0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
34fc0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
34fd0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
34fe0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
34ff0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35000 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
35010 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
35020 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
35030 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
35040 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
35050 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
35060 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50  );.  pPager = pP
35070 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
35080 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47   pPg->flags & PG
35090 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20  HDR_MMAP ){.    
350a0 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
350b0 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
350c0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  e{.    sqlite3Pc
350d0 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
350e0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
350f0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
35100 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  er);.}.void sqli
35110 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
35120 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
35130 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50  ( pPg ) sqlite3P
35140 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
35150 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
35160 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
35170 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
35180 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
35190 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
351a0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
351b0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
351c0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
351d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
351e0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
351f0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
35200 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
35210 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
35220 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
35230 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
35240 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
35250 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
35260 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
35270 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
35280 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
35290 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
352a0 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
352b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
352c0 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
352d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
352e0 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
352f0 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
35300 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
35310 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
35320 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
35330 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
35340 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
35350 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
35360 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
35370 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
35380 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
35390 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
353a0 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
353b0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
353c0 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
353d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
353e0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
353f0 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
35400 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
35410 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
35420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
35430 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
35440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
35450 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
35460 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
35470 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
35480 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
35490 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
354a0 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
354b0 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
354c0 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
354d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
354e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
354f0 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
35500 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
35510 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
35520 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
35530 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
35540 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
35550 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
35560 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
35570 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
35580 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
35590 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
355a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
355c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
355d0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
355e0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
355f0 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
35600 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
35610 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
35620 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35630 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
35640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35650 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35660 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
35670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
35680 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
35690 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
356a0 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
356b0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
356c0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
356d0 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
356e0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
356f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
35700 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
35710 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
35720 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
35730 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
35740 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
35750 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
35760 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
35770 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
35780 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
35790 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
357a0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
357b0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
357c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
357d0 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
357e0 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
357f0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
35800 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35810 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
35820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
35830 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  MEM;.    }.  .  
35840 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
35850 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
35860 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
35870 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
35880 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
35890 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
358a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
358b0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
358c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
358d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
358e0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
358f0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
35900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
35910 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
35920 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
35930 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
35940 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
35950 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 23 69  urnal file */.#i
35960 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
35970 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
35980 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
35990 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
359a0 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
359b0 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
359c0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 53  ndif.          S
359d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
359e0 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
359f0 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
35a00 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
35a10 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
35a20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
35a30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
35a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
35a50 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
35a60 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
35a70 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
35a80 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20  .          );.. 
35a90 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79         /* Verify
35aa0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
35ab0 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65  se still has the
35ac0 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74   same name as it
35ad0 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20   did when.      
35ae0 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67    ** it was orig
35af0 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a  inally opened. *
35b00 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 64  /.        rc = d
35b10 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
35b20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
35b30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35b40 5f 4f 4b 20 29 7b 0a 23 69 66 64 65 66 20 53 51  _OK ){.#ifdef SQ
35b50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
35b60 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
35b70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
35b80 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
35b90 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
35ba0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
35bb0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
35bc0 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
35bd0 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
35be0 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
35bf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35c00 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
35c10 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
35c20 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
35c30 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e  , flags, 0);.#en
35c40 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
35c50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
35c60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
35c70 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
35c80 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
35c90 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57  }.  .  .    /* W
35ca0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
35cb0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35cd0 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20  e and open .    
35ce0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
35cf0 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
35d00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
35d10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35d20 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
35d30 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20  Check if all of 
35d40 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79  these are really
35d50 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
35d60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
35d70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35d80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
35d90 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
35da0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
35db0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
35dc0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
35dd0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
35de0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
35df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
35e00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35e10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
35e20 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
35e30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35e40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
35e50 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
35e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35e70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35e80 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35e90 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70  _LOCKED );.    p
35ea0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
35eb0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
35ec0 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65  HEMOD;.  }..  re
35ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35ee0 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
35ef0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
35f00 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
35f10 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
35f20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
35f30 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35f40 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
35f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
35f60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
35f70 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
35f80 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
35f90 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
35fa0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
35fb0 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
35fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
35fd0 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
35fe0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
35ff0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
36000 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
36010 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
36020 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
36030 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
36040 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
36050 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
36060 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
36070 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
36080 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20  -zero, then any 
36090 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  sub-journal open
360a0 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ed.** within thi
360b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  s transaction wi
360c0 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20  ll be opened as 
360d0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
360e0 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e  e. This.** has n
360f0 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20  o effect if the 
36100 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61  sub-journal is a
36110 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61  lready opened (a
36120 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e  s it may be when
36130 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  .** running in e
36140 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f  xclusive mode) o
36150 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  r if the transac
36160 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
36170 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a  quire a.** sub-j
36180 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73  ournal. If the s
36190 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
361a0 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  ment is zero, th
361b0 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a  en any required.
361c0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  ** sub-journal i
361d0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  s implemented in
361e0 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65  -memory if pPage
361f0 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  r is an in-memor
36200 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20  y database, .** 
36210 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f  or using a tempo
36220 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77  rary file otherw
36230 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
36240 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61  te3PagerBegin(Pa
36250 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
36260 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62   exFlag, int sub
36270 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e  jInMemory){.  in
36280 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36290 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
362a0 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
362b0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
362c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
362d0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
362e0 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61  ER_READER && pPa
362f0 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
36300 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61  R_ERROR );.  pPa
36310 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
36320 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65  y = (u8)subjInMe
36330 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57  mory;..  if( ALW
36340 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61  AYS(pPager->eSta
36350 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
36360 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
36370 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
36380 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  nal==0 );..    i
36390 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
363a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
363b0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
363c0 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  is configured to
363d0 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64   use locking_mod
363e0 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64  e=exclusive, and
363f0 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63   an.      ** exc
36400 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
36410 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
36420 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ot already held,
36430 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a   obtain it now..
36440 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
36450 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
36460 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69  siveMode && sqli
36470 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
36480 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
36490 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  , -1) ){.       
364a0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
364b0 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
364c0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
364d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
364e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
364f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
36510 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
36520 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
36530 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Wal, 1);.      }
36540 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20  ..      /* Grab 
36550 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
36560 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
36570 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75  If successful, u
36580 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20  pgrade to.      
36590 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
365a0 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  D state. Otherwi
365b0 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  se, return an er
365c0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
365d0 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a  caller..      **
365e0 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   The busy-handle
365f0 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64  r is not invoked
36600 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   if another conn
36610 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20  ection already. 
36620 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68       ** holds th
36630 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66  e write-lock. If
36640 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75   possible, the u
36650 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
36660 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a  call it..      *
36670 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
36680 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74  ite3WalBeginWrit
36690 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  eTransaction(pPa
366a0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
366b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
366c0 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  Obtain a RESERVE
366d0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
366e0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
366f0 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d  the exFlag param
36700 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  eter.      ** is
36710 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65   true, then imme
36720 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20  diately upgrade 
36730 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55  this to an EXCLU
36740 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
36750 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e       ** busy-han
36760 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61  dler callback ca
36770 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75  n be used when u
36780 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20  pgrading to the 
36790 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20  EXCLUSIVE.      
367a0 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74  ** lock, but not
367b0 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20   when obtaining 
367c0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
367d0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
367e0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
367f0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
36800 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
36810 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36820 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a  OK && exFlag ){.
36830 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
36840 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
36850 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
36860 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
36870 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
36880 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36890 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65  .      /* Change
368a0 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   to WRITER_LOCKE
368b0 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  D state..      *
368c0 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d  *.      ** WAL m
368d0 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65  ode sets Pager.e
368e0 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57  State to PAGER_W
368f0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20  RITER_LOCKED or 
36900 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a  CACHEMOD.      *
36910 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e  * when it has an
36920 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f   open transactio
36930 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20  n, but never to 
36940 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45  DBMOD or FINISHE
36950 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  D..      ** This
36960 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
36970 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20  hose states the 
36980 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63  code to roll bac
36990 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  k savepoint .   
369a0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
369b0 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61  ns may copy data
369c0 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
369d0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  urnal into the d
369e0 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a  atabase .      *
369f0 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61  * file as well a
36a00 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20  s into the page 
36a10 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75  cache. Which wou
36a20 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20  ld be incorrect 
36a30 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c  in .      ** WAL
36a40 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   mode..      */.
36a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
36a60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
36a70 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  TER_LOCKED;.    
36a80 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
36a90 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36aa0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36ab0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
36ac0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36ad0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36ae0 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
36af0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36b00 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36b10 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
36b20 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
36b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
36b40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
36b50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
36b60 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
36b70 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
36b80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36b90 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
36bb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36bc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  e(pPager) );.  }
36bd0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
36be0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
36bf0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
36c00 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  er)));.  return 
36c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
36c20 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
36c30 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
36c40 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
36c50 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
36c60 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
36c70 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
36c80 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
36c90 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
36ca0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
36cb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
36cc0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
36cd0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
36ce0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
36cf0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
36d00 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
36d10 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
36d20 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
36d30 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
36d40 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
36d50 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
36d60 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
36d70 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
36d80 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
36d90 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
36da0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36db0 4b 3b 0a 20 20 69 6e 74 20 69 6e 4a 6f 75 72 6e  K;.  int inJourn
36dc0 61 6c 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  al;..  /* This r
36dd0 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
36de0 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72  lled unless a wr
36df0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
36e00 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a  has already .  *
36e10 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  * been started. 
36e20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
36e30 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
36e40 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20  be open at this 
36e50 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69  point..  ** It i
36e60 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
36e70 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
36e80 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
36e90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36ea0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
36eb0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
36ec0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36ed0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
36ee0 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
36ef0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
36f00 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
36f10 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
36f20 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36f30 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
36f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36f50 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a  ->errCode==0 );.
36f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36f70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
36f80 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
36f90 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
36fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
36fb0 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
36fc0 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
36fd0 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
36fe0 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
36ff0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
37000 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
37010 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
37020 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
37030 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
37040 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
37050 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
37060 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
37070 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
37080 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
37090 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
370a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
370b0 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
370c0 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
370d0 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
370e0 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
370f0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
37100 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
37110 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
37120 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
37130 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
37140 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
37150 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
37160 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
37170 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
37180 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
37190 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
371a0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
371b0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
371c0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
371d0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
371e0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
371f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37200 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
37210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37220 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
37230 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
37240 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
37250 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
37260 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
37270 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
37280 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
37290 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
372a0 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
372b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
372c0 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
372d0 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
372e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
372f0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
37300 29 3b 0a 20 20 69 6e 4a 6f 75 72 6e 61 6c 20 3d  );.  inJournal =
37310 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
37320 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 69  Pager, pPg);.  i
37330 66 28 20 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  f( inJournal && 
37340 28 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  (pPager->nSavepo
37350 69 6e 74 3d 3d 30 20 7c 7c 20 21 73 75 62 6a 52  int==0 || !subjR
37360 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
37370 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
37380 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
37390 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65  ager) );.  }else
373a0 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  {.  .    /* The 
373b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
373c0 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61  nal now exists a
373d0 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45 53  nd we have a RES
373e0 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20  ERVED or an.    
373f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
37400 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  k on the main da
37410 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72  tabase file.  Wr
37420 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
37430 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74  page to.    ** t
37440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
37450 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20  ournal if it is 
37460 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
37470 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
37480 28 20 21 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ( !inJournal && 
37490 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
374a0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
374b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
374c0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
374d0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
374e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
374f0 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
37500 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
37510 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
37520 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
37530 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
37540 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
37550 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37560 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
37570 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
37580 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
37590 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
375a0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
375b0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
375c0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
375d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
375e0 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
375f0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
37600 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
37610 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
37620 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
37630 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
37640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37650 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37660 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
37670 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
37680 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
37690 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
376a0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
376b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
376c0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
376d0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
376e0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
376f0 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20 20  *)pData2);..    
37700 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61      /* Even if a
37710 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
37720 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37730 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
37740 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
37750 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  age in the block
37760 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20   above, set the 
37770 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66  need-sync flag f
37780 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  or the page..   
37790 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
377a0 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  e, when the tran
377b0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
377c0 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69  d back, the logi
377d0 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  c in.        ** 
377e0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
377f0 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74  e() will think t
37800 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
37810 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65  ds to be restore
37820 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20  d.        ** in 
37830 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37840 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20  e. And if an IO 
37850 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
37860 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20  le doing so,.   
37870 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72       ** then cor
37880 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c  ruption may foll
37890 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ow..        */. 
378a0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
378b0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
378c0 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20 72  SYNC;..        r
378d0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
378e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
378f0 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
37900 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
37910 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
37920 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
37930 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
37940 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
37950 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
37960 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29  ageSize, iOff+4)
37970 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37980 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37990 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
379a0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
379b0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
379c0 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  Off+pPager->page
379d0 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a  Size+4, cksum);.
379e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
379f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37a00 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
37a10 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
37a20 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
37a30 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
37a40 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
37a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37a60 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
37a70 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
37a80 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
37a90 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
37aa0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
37ab0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
37ac0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
37ad0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
37ae0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
37af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
37b00 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
37b10 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
37b20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
37b30 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
37b40 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
37b50 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
37b60 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67  );..        pPag
37b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
37b80 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  = 8 + pPager->pa
37b90 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
37ba0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
37bb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37bc0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37bd0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
37be0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
37bf0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
37c00 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
37c10 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
37c20 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
37c30 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
37c40 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
37c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
37c60 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
37c70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
37c80 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
37c90 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
37ca0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
37cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37cd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
37ce0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
37cf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
37d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
37d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37d30 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45  ate!=PAGER_WRITE
37d40 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20  R_DBMOD ){.     
37d50 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
37d60 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
37d70 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
37d80 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
37d90 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
37da0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
37db0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37dc0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
37dd0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
37de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37df0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
37e00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
37e10 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
37e20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
37e30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
37e40 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
37e50 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
37e60 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
37e70 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
37e80 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
37e90 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
37ea0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
37eb0 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
37ec0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
37ed0 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
37ee0 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
37ef0 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
37f00 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
37f10 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
37f20 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
37f30 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
37f40 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  if( pPager->nSav
37f50 65 70 6f 69 6e 74 3e 30 20 26 26 20 73 75 62 6a  epoint>0 && subj
37f60 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
37f70 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
37f80 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
37f90 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
37fa0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
37fb0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
37fc0 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
37fd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
37fe0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
37ff0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
38000 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
38010 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
38020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
38030 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20  is a variant of 
38040 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
38050 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77 68  e() that runs wh
38060 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  en the sector si
38070 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20  ze.** is larger 
38080 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73 69  than the page si
38090 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65  ze.  SQLite make
380a0 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c  s the (reasonabl
380b0 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68  e) assumption th
380c0 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20  at.** all bytes 
380d0 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65 20  of a sector are 
380e0 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72  written together
380f0 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20 48   by hardware.  H
38100 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20  ence, all bytes 
38110 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e  of.** a sector n
38120 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61  eed to be journa
38130 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20  lled in case of 
38140 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20  a power loss in 
38150 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
38160 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20   a write..**.** 
38170 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63  Usually, the sec
38180 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73  tor size is less
38190 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
381a0 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c  o the page size,
381b0 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73   in which.** cas
381c0 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20 69  e pages can be i
381d0 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74  ndividually writ
381e0 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ten.  This routi
381f0 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20  ne only runs in 
38200 74 68 65 20 65 78 63 65 70 74 69 6f 6e 61 6c 0a  the exceptional.
38210 2a 2a 20 63 61 73 65 20 77 68 65 72 65 20 74 68  ** case where th
38220 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
38230 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
38240 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a  sector size..*/.
38250 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
38260 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
38270 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f 72  WriteLargeSector
38280 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
38290 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
382a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
382b0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
382c0 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75  .  Pgno nPageCou
382d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
382e0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
382f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
38300 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
38310 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
38320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38330 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
38340 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
38350 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
38360 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20  /.  int nPage = 
38370 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
38380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
38390 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
383a0 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
383b0 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20   */.  int ii;   
383c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
383d0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
383e0 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  nter */.  int ne
383f0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
38400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
38410 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
38420 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
38430 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
38440 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
38450 72 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  r;   /* The page
38460 72 20 74 68 61 74 20 6f 77 6e 73 20 70 50 67 20  r that owns pPg 
38470 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  */.  Pgno nPageP
38480 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
38490 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
384a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
384b0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
384c0 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
384d0 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73  C bit to 1. This
384e0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
384f0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a 2a  annot allow.  **
38500 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
38510 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
38520 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
38530 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
38540 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
38550 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
38560 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
38570 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
38580 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
38590 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30  LFLAG_NOSYNC)==0
385a0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 6f   );.  pPager->do
385b0 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
385c0 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20  LFLAG_NOSYNC;.. 
385d0 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
385e0 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
385f0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
38600 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
38610 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  re.  ** an integ
38620 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
38630 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
38640 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
38650 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66 20 74 68  ifier.  ** of th
38660 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
38670 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
38680 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
38690 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28 70 50 67  */.  pg1 = ((pPg
386a0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
386b0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
386c0 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67 65 43 6f   + 1;..  nPageCo
386d0 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
386e0 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 67 2d  Size;.  if( pPg-
386f0 3e 70 67 6e 6f 3e 6e 50 6