/ Hex Artifact Content
Login

Artifact 9c1eec0d88133484b165fa0b5284a411c24b964c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
7c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
7c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7c20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c30: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
7c40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
7c50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
7c60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7c70: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
7c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
7c90: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
7ca0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7cb0: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
7cc0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
7cd0: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
7ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7cf0: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
7d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7d20: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
7d30: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
7d40: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
7d50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
7d60: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
7d70: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
7d80: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
7d90: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
7da0: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
7db0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
7dc0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
7dd0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
7de0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
7df0: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7e20: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
7e30: 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61  ] */.  u32 iData
7e40: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
7e50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7e60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7e70: 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20  content changes 
7e80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
7e90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
7ea0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7eb0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
7ec0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
7ed0: 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20   int nMmapOut;  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70  Number of mmap p
7f00: 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  ages currently o
7f10: 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20  utstanding */.  
7f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7f30: 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44  Mmap;       /* D
7f40: 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d  esired maximum m
7f50: 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67  map size */.  Pg
7f60: 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69  Hdr *pMmapFreeli
7f70: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st;       /* Lis
7f80: 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70  t of free mmap p
7f90: 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69  age headers (pDi
7fa0: 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  rty) */.  /*.  *
7fb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7fc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7fd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
8030: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8050: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
8060: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
8070: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
8080: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80a0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
80b0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
80c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
80d0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
80f0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
8100: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
8110: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8130: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8140: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
8150: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
8160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
8190: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
81a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
81b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
81c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
81d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
81e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
81f0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
8200: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
8210: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
8220: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
8230: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
8240: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
8270: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
8280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
82a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
82b0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
82c0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
82d0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
82e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
82f0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8300: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8310: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8320: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  ndler */.  int a
8330: 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20  Stat[3];        
8340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8350: 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  cache hits, miss
8360: 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f  es and writes */
8370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8380: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
83b0: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
83c0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
83d0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
83e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
83f0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
8400: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
8420: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
8430: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
8440: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
8450: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
8460: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
8470: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8480: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
8490: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
84a0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
84b0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
84c0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
84d0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
84e0: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
84f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
8500: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
8510: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
8520: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
8530: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
8540: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
8550: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
8560: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
8570: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
8580: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
8590: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
85a0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
85b0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
85c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
85d0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
85e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
8600: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
8620: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
8630: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
8640: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
8650: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
8660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8670: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
8680: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
8690: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  if.};../*.** Ind
86a0: 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74  exes for use wit
86b0: 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e  h Pager.aStat[].
86c0: 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74   The Pager.aStat
86d0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
86e0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20  s.** the values 
86f0: 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73  accessed by pass
8700: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41  ing SQLITE_DBSTA
8710: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43  TUS_CACHE_HIT, C
8720: 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72  ACHE_MISS .** or
8730: 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20   CACHE_WRITE to 
8740: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8750: 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  s()..*/.#define 
8760: 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20  PAGER_STAT_HIT  
8770: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
8780: 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64  _STAT_MISS  1.#d
8790: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87a0: 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20  _WRITE 2../*.** 
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
87c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
87d0: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
87e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
87f0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
8800: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8810: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
8820: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
8830: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
8840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
8850: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
8860: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8870: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
8880: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
8890: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
88a0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
88b0: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
88c0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
88d0: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
88e0: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
88f0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8900: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
8910: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
8920: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
8930: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8940: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
8950: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
8960: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
8970: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
8980: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
8990: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
89a0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
89b0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
89c0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
89d0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
89e0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
89f0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
8a00: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
8a10: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
8a20: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
8a30: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
8a40: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
8a50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8a60: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
8a70: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
8a80: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8a90: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
8aa0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
8ab0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8ac0: 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  ng.** written, s
8ad0: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
8ae0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
8af0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
8b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
8b10: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
8b20: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
8b30: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
8b40: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
8b50: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
8b60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
8b70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
8b80: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
8b90: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
8ba0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
8bb0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
8bc0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
8bd0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
8be0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
8bf0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
8c00: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8c10: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
8c20: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8c30: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
8c40: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
8c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
8c60: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
8c70: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
8c80: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
8c90: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
8ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
8cb0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
8cc0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
8cd0: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
8ce0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
8cf0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
8d00: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
8d10: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
8d20: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
8d30: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
8d40: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
8d50: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
8d60: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
8d70: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
8d80: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
8d90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
8da0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
8db0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
8dc0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
8dd0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
8de0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
8df0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
8e00: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
8e10: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
8e20: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
8e30: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
8e40: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
8e60: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
8e70: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
8e80: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
8e90: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
8ea0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
8eb0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8ed0: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
8ee0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
8ef0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
8f00: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
8f10: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
8f30: 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70  of the of each p
8f40: 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68  age record in th
8f50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76  e journal is giv
8f60: 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c  en by.** the fol
8f70: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f  lowing macro..*/
8f80: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8f90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
8fa0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
8fb0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
8fc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
8fd0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
8fe0: 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20   pager. This is 
8ff0: 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  usually the same
9000: 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73   .** size as a s
9010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
9020: 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53  r. See also setS
9030: 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a  ectorSize()..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
9060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9070: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
9080: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
9090: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
90a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
90b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
90c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
90d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
90e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
90f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
9100: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
9110: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
9120: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
9130: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
9140: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
9150: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
9160: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
9170: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
9180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9190: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
91a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
91b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
91c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
91d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
91e0: 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73  acro USEFETCH is
91f0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9200: 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74  allowed to use t
9210: 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55  he xFetch and xU
9220: 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66  nfetch.** interf
9230: 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  aces to access t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
9250: 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  g memory-mapped 
9260: 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  I/O..*/.#if SQLI
9270: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
9280: 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46  >0.# define USEF
9290: 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55  ETCH(x) ((x)->bU
92a0: 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23  seFetch).#else.#
92b0: 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48   define USEFETCH
92c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
92d0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
92e0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
92f0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
9300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
9310: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
9320: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
9330: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9340: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
9350: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
9360: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
9370: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
9380: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
9390: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
93a0: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
93b0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
93c0: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
93d0: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
93e0: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
93f0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
9400: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
9410: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
9420: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
9430: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
9440: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
9450: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
9460: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
9470: 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s!=0)../*.** Ret
9480: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9490: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
94a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
94b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
94c0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
94d0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
94e0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
94f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9500: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9510: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9520: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9530: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9540: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9550: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9560: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9570: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9580: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9590: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
95a0: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
95b0: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
95c0: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
95d0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
95e0: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
95f0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9600: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9610: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9620: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9630: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
9640: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9650: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9670: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9680: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9690: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
96a0: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
96b0: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
96c0: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
96e0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
96f0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9700: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9710: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9720: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9730: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
9740: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9750: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9760: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9770: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9780: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9790: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
97a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97b0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
97c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97e0: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
97f0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9800: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9810: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9820: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9830: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9840: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9850: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9860: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9870: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9880: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9890: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
98a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
98c0: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
98d0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
98e0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
98f0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9900: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9910: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9920: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9930: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9940: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9950: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9960: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9970: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9980: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9990: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
99a0: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
99b0: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
99c0: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
99d0: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
99e0: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
99f0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9a10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9a20: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9a30: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9a40: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9a50: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9a60: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9a70: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a80: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9a90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9aa0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9ab0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9ac0: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9ad0: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9af0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9b00: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9b10: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9b20: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9b30: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9b40: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9b50: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9b60: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9b70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9b80: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9b90: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9bb0: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9bc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9bd0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9be0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9c10: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9c20: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9c30: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9c40: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9c50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9c60: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9c70: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9c80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9c90: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9ca0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d10: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
9d30: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
9d40: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9d50: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9d60: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9d70: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9d80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9da0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9db0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9dc0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9dd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9de0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9df0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9e00: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9e10: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9e20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9e30: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
9e40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9e50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9e60: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9e70: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9e80: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9e90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9eb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9ed0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9ee0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9ef0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9f20: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9f30: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f70: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9f80: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9f90: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9fa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9fc0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9fd0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a030: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a040: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a060: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a070: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a090: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a0a0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a0b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a0e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a100: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a110: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a120: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a140: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a150: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a160: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a170: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a190: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a1c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a1d0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a1e0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a200: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a210: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a220: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a230: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a240: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a250: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a260: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a270: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a280: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a290: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a2a0: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a2b0: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a2c0: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a2d0: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a2e0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a300: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a310: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a330: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a370: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a380: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a390: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3a0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a3e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a3f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a410: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a420: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a440: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a450: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a460: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a470: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a480: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a490: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a4e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a4f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a510: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a530: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a540: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a550: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a580: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a5b0: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a5c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a5d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a5f0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a600: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a610: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a630: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a650: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a680: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6c0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a6d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a6e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a6f0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a700: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a710: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a720: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a730: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a740: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a750: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a760: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a770: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a780: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a790: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a7a0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a7b0: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a7c0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a7d0: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a800: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a820: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a830: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a840: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a850: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a860: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a870: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a880: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a890: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a8b0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a8c0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a8d0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a8e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a8f0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a900: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a910: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a920: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a930: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a940: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a950: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a960: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a970: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a980: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a990: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a9a0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a9b0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a9d0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a9e0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a9f0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aa00: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aa10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aa20: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aa30: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aa40: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
aa50: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aa60: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aa70: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aa80: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aa90: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aaa0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aab0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
aac0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
aad0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
aae0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aaf0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
ab00: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
ab10: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
ab20: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
ab30: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
ab40: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ab50: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ab60: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ab70: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ab80: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ab90: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
aba0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
abc0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
abd0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
abe0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
abf0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
ac00: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
ac10: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac20: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ac30: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
ac40: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ac50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac60: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ac70: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ac80: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ac90: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
aca0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
acb0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
acf0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
ad20: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ad30: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
ad40: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ad50: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ad60: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ad70: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ad80: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ad90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
adb0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
adc0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
add0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ade0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
adf0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
ae00: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
ae10: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
ae20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
ae30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
ae40: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
ae50: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
ae60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
ae70: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
ae80: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
ae90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aea0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aeb0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
aec0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
aed0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aee0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aef0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
af00: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
af10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
af30: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
af40: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
af50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
af70: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
af80: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
af90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
afa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
afb0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
afc0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
afd0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
afe0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aff0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b000: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b010: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b020: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b030: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b040: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b050: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b060: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b070: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b080: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b090: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b0a0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b0b0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b0c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b0e0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b0f0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b100: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b110: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b120: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b130: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b140: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b150: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b160: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b170: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b180: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b190: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b1a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b1b0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b1c0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b1d0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b1e0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b200: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b210: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b220: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b230: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b240: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b250: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b260: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b270: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b280: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b290: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b2a0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b2b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b2c0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b2d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b2e0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b2f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b310: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b330: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b340: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b380: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b3a0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b3b0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b3c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b3e0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b3f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b400: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b410: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b420: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b430: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b450: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b460: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b470: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b480: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b490: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b4a0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b4b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b4c0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b4d0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b4e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b4f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b500: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b510: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b520: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b530: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b540: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b550: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b560: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b570: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b590: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b5a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b5b0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b5c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b5e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b5f0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b620: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b630: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b640: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b650: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b660: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b670: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b680: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b690: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b6a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b6b0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b6c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b6d0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b6f0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b700: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b710: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b730: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b740: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b750: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b760: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b770: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b780: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b790: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b7a0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b7c0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b7d0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b7e0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b800: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b810: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b820: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b840: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b850: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b860: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b870: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b880: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b890: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b8a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b8b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b8c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b8e0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b8f0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b920: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b930: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b940: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b950: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b960: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b970: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b980: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b9a0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b9b0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b9c0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b9d0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b9e0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b9f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
ba00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ba10: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
ba20: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
ba30: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
ba40: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
ba50: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
ba60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
ba70: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
ba80: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
ba90: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
baa0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bab0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bac0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bae0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
baf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bb00: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bb20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bb30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bb40: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bb50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb60: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bb70: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bb80: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb90: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bba0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bbb0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bbc0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bbd0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bbe0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bbf0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bc00: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bc10: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bc20: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bc30: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bc40: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bc50: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bc60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bc70: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc80: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bc90: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bca0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bcb0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bcc0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bcd0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bce0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bcf0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bd00: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bd30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bd40: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bd50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bd60: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bd80: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd90: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bda0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bdc0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bdd0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bdf0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
be00: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
be10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
be20: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
be50: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
be60: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
be70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
be80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
be90: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bea0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
beb0: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bec0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bed0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bf00: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bf10: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf20: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bf30: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bf40: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bf50: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bf60: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bf70: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bf80: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bf90: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bfa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bfb0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bfc0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bfd0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bfe0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bff0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c000: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c010: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c020: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c030: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c040: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c050: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c060: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c070: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c080: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c090: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c0a0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c0b0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c0c0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c0d0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c0e0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c0f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c100: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c110: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c120: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c130: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c150: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c180: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c190: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c1a0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c1b0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c1d0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c1e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c1f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c200: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c210: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c230: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c260: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c270: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c280: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c2a0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c2b0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c2e0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c2f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c300: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c310: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c330: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c340: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c350: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c360: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c380: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c390: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c3a0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c3b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c3c0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c3d0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c3e0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c3f0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c400: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c410: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c450: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c460: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c470: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c480: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c490: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c4a0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c4b0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c4c0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c4d0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c4e0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c4f0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c500: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c520: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c530: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c540: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c550: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c560: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c580: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c590: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c5a0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c5b0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c5d0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c5e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c5f0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c600: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c610: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c620: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c630: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c640: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c650: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c660: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c670: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c680: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c690: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c6a0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c6b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c6c0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c6d0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c6e0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c700: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c710: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c720: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c730: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c740: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c750: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c760: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c770: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c780: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c790: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c7a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c7b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c7c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c7d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c7e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c7f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c800: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c810: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c820: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c830: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c840: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c850: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c860: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c870: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c880: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c890: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c8a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c8b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c8c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c8d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c8e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c8f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c900: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c910: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c920: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c930: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c940: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c950: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c960: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c970: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c980: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c990: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c9b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c9c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c9e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c9f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca00: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca10: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
ca20: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
ca30: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
ca40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
ca50: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ca60: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
ca70: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
ca80: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
ca90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
caa0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cab0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cac0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cad0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cae0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
caf0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb00: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb10: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cb20: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cb30: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cb40: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cb50: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cb60: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cb70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb80: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cb90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cba0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cbb0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cbc0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cbd0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cbe0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cbf0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc00: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cc20: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cc30: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cc50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cc70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cc90: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cca0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ccb0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ccc0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ccd0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cce0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ccf0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd10: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cd20: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cd30: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cd40: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cd50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd70: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cd80: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cd90: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cda0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cdb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cdc0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cdf0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce00: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce10: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ce20: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ce30: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
ce40: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ce50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ce60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ce70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce80: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ce90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cea0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ceb0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cec0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ced0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf00: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf10: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cf20: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf40: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cf50: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cf60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cf90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cfa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cfb0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cfc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cfd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cfe0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cff0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d000: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d020: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d030: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d040: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d050: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d060: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d070: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d080: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d090: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d0b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d0c0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d0d0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d0e0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d100: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d110: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d120: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d130: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d140: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d150: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d160: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d170: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d190: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d1a0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d1b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d1c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d1d0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d1e0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d1f0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d200: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d210: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d230: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d240: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d250: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d260: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d270: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d280: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d290: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d2a0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d2b0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d2c0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2e0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d2f0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d300: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d310: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d320: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d330: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d340: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d370: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d380: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d390: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d3a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d3b0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d3d0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d3e0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d3f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d400: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d410: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d420: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d430: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d440: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d450: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d4d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d4e0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d4f0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d500: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d510: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d520: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d530: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d540: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d550: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d570: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d580: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d590: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d5a0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d5b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d5d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d5e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5f0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d600: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d620: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d640: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d670: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d690: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d6b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d6c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d6d0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d6e0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d6f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d700: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d710: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d720: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d730: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d740: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d750: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d760: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d770: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d780: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d790: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d7a0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d7b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d7c0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d7d0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d7e0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d7f0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d800: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d820: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d830: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d840: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d850: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d860: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d870: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d880: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d890: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d8a0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d8b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d8c0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d8d0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d8e0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d8f0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d900: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d910: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d920: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d930: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d940: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d950: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d960: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d970: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d980: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d990: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d9a0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d9b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d9c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d9d0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d9e0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da00: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da10: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
da20: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
da30: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
da40: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
da50: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
da60: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
da70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dab0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
dac0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dad0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
db00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
db20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
db30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
db40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
db50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
db60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
db70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
db80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
db90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dbb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dbd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dbe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dbf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dc00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dc10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dc20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dc30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dc60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dc80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dc90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dca0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dcb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dcc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dcd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dce0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dcf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dd00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dd10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dd20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dd30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dd40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dd50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dd60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dd70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dd80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dd90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dda0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
ddb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
ddc0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ddd0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dde0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
ddf0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
de00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
de10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
de20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
de40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
de50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
de60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
de70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
de80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
deb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dec0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ded0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
def0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
df10: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
df20: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
df30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
df40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
df50: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
df60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
df70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
df90: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
dfa0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
dfb0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
dfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dfd0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
dfe0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
dff0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e000: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e010: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e030: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e040: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e050: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e060: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e070: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e080: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e090: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e0a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e0b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e0c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e0d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e0e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e0f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e100: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e110: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e120: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e130: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e140: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e150: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e160: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e1d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e1e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e1f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e200: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e210: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e220: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e230: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e240: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e250: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e260: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e290: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e2a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e2b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e2e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e2f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e300: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e310: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e320: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e330: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e350: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e360: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e370: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e390: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e3a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e3b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e3c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e3e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e400: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e410: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e420: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e430: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e440: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e460: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e470: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e480: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e490: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e4a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e4e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e4f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e500: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e510: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e5a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e5b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e5c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e5d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e5e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e6a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e6b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e6c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e6d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e6e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e6f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e7a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e7b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e7c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e7d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e7e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e7f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e8a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e8b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e8c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e8d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e8e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e8f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e950: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e960: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e970: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e980: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e990: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e9a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e9b0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e9c0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e9d0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e9e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e9f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
ea00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ea10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ea20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ea30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
ea60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
ea70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
ea90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eaa0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eab0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eac0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ead0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eae0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eaf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eb00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
eb30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
eb40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eb50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eb60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eb70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eb90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eba0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ebb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ebc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ebd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ebe0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ebf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ec10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ec20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ec30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ec40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ec50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ec60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ec70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ec80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ec90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eca0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ecb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ecc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ecd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ece0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ecf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ed00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ed10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ed20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ed30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ed40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ed50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ed60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ed70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ed80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eda0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
edb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
edc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
edd0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ede0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
edf0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ee00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ee10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ee20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ee30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ee40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ee50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ee60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ee70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ee80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ee90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
eea0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
eeb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
eec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eed0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
eee0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eef0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ef00: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ef10: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ef20: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ef30: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ef40: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
ef50: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
ef60: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
ef70: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
ef80: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
ef90: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
efa0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
efb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
efc0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
efd0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
efe0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
eff0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f000: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f010: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f020: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f030: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f040: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f050: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f060: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f070: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f080: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f090: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f0a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f0b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f0c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f0d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f0e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f0f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f100: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f110: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f120: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f130: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f140: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f150: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f160: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f170: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f190: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f1b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f1c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f1d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f1e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f200: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f210: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f220: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f230: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f240: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f250: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f260: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f270: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f290: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f2a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f2e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f2f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f300: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f310: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f320: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f330: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f350: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f360: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f370: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f390: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f3a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f3c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f3d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f3e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f3f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f410: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f420: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f430: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f440: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f460: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f480: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f490: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f4a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f4b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f4c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f4d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f4e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f4f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f500: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f510: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f520: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f530: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f540: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f570: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f580: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f590: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f5a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f5b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f5c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f5d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f5e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f5f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f610: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f620: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f640: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f650: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f670: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f680: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f690: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f6a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f6c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f6d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f6e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f6f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f700: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f710: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f720: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f750: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f760: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f770: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f7a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f7b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f7c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f7d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f7e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f7f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f810: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f820: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f830: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f840: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f850: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f860: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f870: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f880: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f890: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f8a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f8b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f8c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f8d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f8e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f8f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f900: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f910: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f920: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f940: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f950: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f960: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f970: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f990: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f9c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f9e0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f9f0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fa00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fa20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fa30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fa40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fa50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fa60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fa90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
faa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fab0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fac0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fad0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fae0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
faf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fb00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fb10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fb20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fb40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fb50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fb70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fb80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fb90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fbb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fbd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fbe0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fc10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fc20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fc30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fc40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fc50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fc60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fc70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fc80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fc90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fca0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fcb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fcc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fcd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fce0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fcf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fd20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fd30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fd40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fd70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fdb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fdc0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdd0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fde0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fe00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fe10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fe20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fe30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fe40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fe50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fe60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fe90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fea0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
feb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fec0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fed0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ff10: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ff20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ff40: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
ff50: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
ff60: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
ff70: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
ff80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
ff90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
ffa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ffb0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ffc0: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ffd0: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ffe0: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
fff0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10000 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10030 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10060 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10070 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10080 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10090 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
100a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
100b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
100c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
100d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
100e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
100f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10100 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10110 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10120 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10130 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10140 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10150 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10160 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10170 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10180 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10190 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
101a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
101b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
101c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
101d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
101e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
101f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10200 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10210 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10220 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10230 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10240 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10250 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10260 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10270 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10280 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10290 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
102a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
102b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
102c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
102d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
102e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
102f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10300 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10310 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10320 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10340 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10370 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10380 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10390 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
103a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
103b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
103c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
103d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
103e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
103f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10400 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10410 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10440 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10450 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10460 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10480 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10490 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
104a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
104b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
104c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
104d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
104e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
104f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10500 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10510 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10520 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10530 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10540 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10550 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10560 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10570 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10580 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10590 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
105a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
105b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
105c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
105d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
105e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
105f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10600 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10610 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10620 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10630 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10650 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10670 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10690 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
106a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
106b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
106c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
106d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
106e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
106f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10700 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10710 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10720 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10740 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10750 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10760 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10770 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10780 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10790 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
107a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
107b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
107c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
107d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
107e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
107f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10800 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10810 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10820 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10830 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10860 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10870 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10880 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10890 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
108a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
108b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
108c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
108d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
108e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
108f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10900 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10910 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10920 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10930 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10940 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10950 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10960 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10970 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10980 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
109a0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
109b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
109c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
109d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10a10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10a40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10a50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10a80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10a90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10aa0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10ac0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10ad0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10ae0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10b10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10b30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10b40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10b60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10b70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ba0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10bb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10bc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10bf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10c10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10c40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10c50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10c60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10c70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10c80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10c90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10ca0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10cb0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10cc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10ce0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10cf0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10d00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10d10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10d30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10d50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10d70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10d80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10d90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10da0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10dc0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10de0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10e20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10e40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10e50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10e60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10e70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10e90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10eb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10ec0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10ed0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ef0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f00 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10f10 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10f20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10f40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10f50 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10f60 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10f70 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10f80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10f90 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10fa0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10fb0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10fe0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11020 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11050 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11060 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11070 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11080 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11090 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
110a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
110b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
110c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
110d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
110e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
110f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11100 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11110 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11120 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11130 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11140 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11150 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11170 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11180 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11190 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
111a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
111b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
111c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
111d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
111e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
111f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11200 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11210 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11220 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11230 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11240 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11250 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11260 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11270 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11280 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11290 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
112a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
112c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
112d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11310 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11330 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11340 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11350 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11360 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11370 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11380 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11390 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
113a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
113b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
113c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
113d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
113e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
113f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11400 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11410 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11420 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11470 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11490 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
114b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
114c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
114d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
114e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
114f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11500 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11510 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11520 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11530 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11540 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11550 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11560 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11580 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
115b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
115c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
115d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
115e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
115f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11600 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11610 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11620 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11630 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11640 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11650 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11680 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11690 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
116b0 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
116c0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
116d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11710 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11720 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11730 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11740 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11750 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11760 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11770 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11790 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
117b0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
117c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
117d0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
117e0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
117f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11800 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11850 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11860 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11870 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11880 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11890 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118a0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
118b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
118c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
118d0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
118e0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
118f0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11900 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11950 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11960 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
119b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
119c0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
119d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
119e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
119f0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a00 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a10 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a30 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a40 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a60 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11a70 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11a80 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11a90 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11aa0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11ab0 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11ac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11ad0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11af0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b00 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b20 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b30 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11b50 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11b60 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11b70 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11b80 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11ba0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11bb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11bc0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11bd0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11be0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11bf0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c00 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c10 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c20 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11c50 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11c70 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11c80 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11c90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11ce0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11cf0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d40 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11d90 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11da0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11dd0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11de0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11df0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e10 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11e60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11e90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ea0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11eb0 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ec0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11ed0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11ee0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ef0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f00 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f10 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f20 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f30 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f40 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11f50 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11f60 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11f70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11f80 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11f90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11fb0 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11fc0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11fd0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11fe0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11ff0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12000 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12020 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12040 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12050 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12060 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12070 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12080 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12090 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
120c0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
120e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
120f0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12100 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12120 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12130 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12140 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12150 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12160 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12170 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12180 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
121b0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
121c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
121d0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
121e0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
121f0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12200 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12210 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12220 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12230 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12240 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12250 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12260 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12270 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12280 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12290 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122a0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
122d0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
122e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
122f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12320 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12330 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12350 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12360 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12370 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12380 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12390 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123a0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
123b0 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
123c0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
123d0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
123e0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
123f0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12400 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12410 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12440 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12450 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12460 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12470 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12490 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124a0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
124b0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
124c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
124d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
124e0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
124f0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12500 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12510 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12520 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12530 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12540 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12550 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12560 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12570 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12580 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12590 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
125b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
125c0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
125d0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
125e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
125f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12600 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12660 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
12670 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
12680 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
12690 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
126b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
126e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12710 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12720 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12730 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12740 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12750 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12760 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12770 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12780 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
127c0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
127d0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
127e0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
127f0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12800 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12810 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12820 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12840 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12850 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12870 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12880 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12890 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128a0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
128b0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
128c0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
128d0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
128e0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
128f0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12900 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12910 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12920 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12930 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12940 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12950 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12960 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12970 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12980 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12990 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
129b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
129c0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
129d0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
129e0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
129f0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a00 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a20 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a30 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a40 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12a50 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12a60 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12a70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12a80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12a90 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12aa0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12ab0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ad0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12ae0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12af0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b00 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b30 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12b50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12b60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12b80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12b90 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12ba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12bb0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12bc0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12bd0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12be0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12bf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c00 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c10 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c30 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12c50 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12c70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12c80 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12c90 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12ca0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12cb0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12cd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12ce0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12cf0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d00 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d10 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d20 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d30 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12d50 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12d60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12d70 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12d90 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12da0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12db0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12dc0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12dd0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e10 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e20 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e30 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e40 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12e50 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12e60 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12e70 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12e80 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12e90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ea0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12eb0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12ed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12ee0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12ef0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f00 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f10 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f20 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f40 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12f50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12f70 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12f80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12f90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12fa0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
12fb0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12fc0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
12fd0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
12fe0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
12ff0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13000 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13010 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13020 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13030 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13040 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13050 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13060 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13070 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13090 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
130b0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
130c0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
130d0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
130e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
130f0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13100 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13110 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13120 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13130 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13140 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13150 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13160 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13170 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13190 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131a0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
131b0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
131d0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
131e0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
131f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13200 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13220 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13240 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13250 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13260 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13270 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13280 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13290 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
132b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132c0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
132d0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
132e0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
132f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13300 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13310 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13320 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13330 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13350 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13360 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13370 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13390 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
133b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
133c0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
133d0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
133e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
133f0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13400 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13430 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13440 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13470 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13480 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13490 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134a0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
134b0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
134c0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
134d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
134e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
134f0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13520 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13530 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13540 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13550 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13560 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13570 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13580 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13590 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
135b0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
135c0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
135d0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
135e0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
135f0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13600 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13610 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13620 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13630 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13640 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13660 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13670 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13680 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13690 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
136b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
136c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
136d0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
136e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
136f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13700 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13720 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13730 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13740 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13750 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13760 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13780 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13790 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
137b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
137c0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
137d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
137e0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
137f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13800 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13810 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13820 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13830 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13840 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13850 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13870 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13880 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13890 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
138b0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
138c0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
138d0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
138e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
138f0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13900 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13910 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13920 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13930 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13940 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13950 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13960 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13980 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13990 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139a0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
139b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139c0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
139d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
139e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
139f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13a50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13a60 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13a70 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13a80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13aa0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13ab0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13ac0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13ae0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13af0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b10 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b40 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13b60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13b70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13b80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13bd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c20 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13c90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13ca0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13cb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13cd0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13ce0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13cf0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13d00 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13d10 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13d20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13d30 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13d50 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13d60 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13d70 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13d80 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13d90 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13db0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13dc0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13dd0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13de0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13df0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13e10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13e20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13e60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ea0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13eb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13ec0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ee0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13ef0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13f10 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13f20 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13f40 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13f60 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13f70 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13f80 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13f90 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13fa0 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13fb0 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13fd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13fe0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ff0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14000 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14010 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14020 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14030 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14040 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14050 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14070 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
14080 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14090 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
140a0 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
140b0 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
140c0 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
140e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14100 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14110 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14130 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14140 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14180 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
141a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
141b0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
141c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
141d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
141e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
141f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
14200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14210 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14220 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14240 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14260 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14280 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14290 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
142a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
142b0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
142c0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
142d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
142e0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
142f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14300 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14320 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14340 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14350 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14360 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14370 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14380 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14390 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
143a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
143b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
143c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
143d0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
143e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
14400 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14410 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
14420 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14430 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14440 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14460 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14470 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14480 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14490 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
144a0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
144b0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
144d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
144e0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
144f0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14500 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14520 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14530 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14550 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14560 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14570 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14580 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14590 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
145a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
145b0 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
145c0 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
145d0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
145f0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14600 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14610 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14620 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14630 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14640 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14660 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14670 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14680 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14690 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
146a0 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
146b0 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
146c0 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
146d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
146e0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
146f0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14700 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14720 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14730 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14740 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14750 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14780 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14790 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
147a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
147b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
147c0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
147d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
147e0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
147f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14800 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14810 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14840 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14860 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14870 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14880 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14890 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
148a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
148b0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
148c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
148d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
148e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
148f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14900 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14910 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14920 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14930 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14950 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14970 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14980 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14990 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
149a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149b0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
149c0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
149d0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
149e0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
149f0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14a00 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14a10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14a20 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14a30 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14a40 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14a50 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14a60 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14a90 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14aa0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14ab0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14ac0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14ad0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14ae0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14af0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14b00 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14b10 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
14b20 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
14b30 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
14b40 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
14b50 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
14b60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14b80 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14b90 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14ba0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14bb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14bc0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14bd0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14be0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14bf0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14c10 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
14c20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
14c30 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14c40 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
14c50 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
14c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14c70 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14c80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14c90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14ca0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14cb0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14cc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14cd0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14ce0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14cf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
14d20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
14d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
14d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14d60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
14d70 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14d90 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14db0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14de0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14df0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14e00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14e10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
14e20 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
14e30 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
14e40 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
14e50 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
14e60 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
14e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
14e80 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
14e90 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
14ea0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
14eb0 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
14ec0 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
14ed0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
14ee0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14ef0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
14f00 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
14f10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
14f20 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
14f30 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
14f40 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
14f50 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
14f60 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
14f70 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
14f80 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
14f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
14fa0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
14fb0 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
14fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
14fd0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
14fe0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
14ff0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15000 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15010 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15020 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15030 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15040 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15050 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15060 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15070 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15080 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15090 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
150a0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
150b0 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
150c0 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
150d0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
150e0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
150f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15100 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15110 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15120 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15130 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15150 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15160 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15170 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15180 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15190 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
151a0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
151b0 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
151c0 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
151d0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
151e0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
151f0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15200 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15220 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15230 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15240 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15250 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15260 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15270 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15280 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152a0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
152b0 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
152c0 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
152d0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
152e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15300 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15310 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
15320 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15330 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15340 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15350 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15360 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15370 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
153a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
153b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
153c0 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
153d0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
153e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15410 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
15420 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15430 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15440 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15450 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15460 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15470 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15480 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15490 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
154a0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
154b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
154c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
154d0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
154e0 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
154f0 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15500 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15510 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15520 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15530 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15540 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15550 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15570 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15580 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15590 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
155a0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
155b0 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
155c0 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
155d0 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
155e0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
155f0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15600 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15610 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15620 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15630 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15640 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15650 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15660 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15670 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15680 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15690 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
156a0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
156b0 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
156c0 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
156d0 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
156e0 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
156f0 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15700 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15710 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15720 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15730 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15740 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15750 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15760 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15770 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15780 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15790 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
157a0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
157b0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
157c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
157d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
157e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
157f0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15800 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15810 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15830 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15840 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15850 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15860 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15870 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15880 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15890 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
158a0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
158b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
158c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
158d0 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
158e0 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
158f0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15900 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15910 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15920 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15930 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15940 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15950 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15960 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15970 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15980 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15990 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
159a0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
159b0 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
159c0 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
159d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
159e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
159f0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15a00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15a10 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15a20 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15a30 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
15a40 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
15a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15a60 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15a70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
15a80 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
15a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15aa0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15ab0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
15ac0 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
15ad0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
15ae0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
15af0 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
15b00 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
15b10 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
15b20 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
15b30 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
15b40 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
15b50 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
15b60 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
15b70 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
15b80 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
15b90 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
15ba0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
15bc0 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
15bd0 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
15be0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
15bf0 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
15c00 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
15c10 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
15c20 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
15c30 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
15c40 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
15c50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
15c60 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15c70 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
15c80 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
15c90 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
15ca0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
15cb0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
15cc0 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
15cd0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
15ce0 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
15cf0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
15d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15d20 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
15d30 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
15d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15d50 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
15d60 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
15d70 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15d90 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
15da0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
15db0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dd0 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
15de0 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
15df0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
15e00 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
15e20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
15e30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
15e40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
15e50 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
15e60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15e70 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15e80 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
15e90 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
15ea0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15eb0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
15ec0 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
15ed0 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
15ee0 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15f00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
15f10 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
15f20 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15f50 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
15f60 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
15f70 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15f90 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
15fa0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
15fb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15fc0 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
15fd0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
15fe0 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
15ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16000 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16030 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16040 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
16050 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
16060 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
16070 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16080 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16090 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
160a0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
160b0 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
160c0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
160d0 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
160e0 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
160f0 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
16100 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
16110 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
16120 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
16130 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
16140 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
16150 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
16160 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
16170 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16180 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16190 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
161a0 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
161b0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
161c0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
161d0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
161e0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
161f0 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
16200 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
16210 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
16220 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
16230 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
16240 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
16250 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16260 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
16270 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16280 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16290 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
162a0 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
162b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
162c0 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
162d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
162e0 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
162f0 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
16300 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
16310 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
16320 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16330 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
16340 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
16350 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
16360 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
16370 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16380 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16390 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
163a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
163b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
163c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
163d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
163e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
163f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16400 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16410 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
16420 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
16430 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
16440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
16450 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
16460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
16470 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16480 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16490 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
164a0 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
164b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
164c0 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
164d0 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
164e0 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
164f0 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16500 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16510 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16550 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16560 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16570 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16580 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
165a0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
165b0 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
165c0 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
165d0 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
165e0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
165f0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16600 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16610 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16620 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16630 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16640 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16650 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16660 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16670 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16680 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16690 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
166a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
166b0 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
166c0 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
166d0 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
166e0 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
166f0 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16700 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16710 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16720 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16730 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16740 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16750 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16760 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16770 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16780 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16790 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
167a0 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
167b0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
167d0 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
167e0 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
167f0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16800 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16810 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16830 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16840 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16850 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16860 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16880 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16890 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
168a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
168b0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
168c0 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
168d0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
168e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
168f0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16900 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16910 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16920 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16930 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16940 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16960 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16970 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16980 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16990 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
169a0 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
169b0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
169c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
169d0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
169e0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
169f0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16a00 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16a10 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16a20 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16a30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
16a40 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
16a50 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
16a60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
16a70 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
16a80 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
16a90 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
16aa0 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
16ab0 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
16ac0 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
16ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16ae0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
16af0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
16b00 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
16b10 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
16b20 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
16b30 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
16b40 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
16b50 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
16b60 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
16b70 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
16b80 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
16b90 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
16ba0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
16bb0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
16bc0 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
16bd0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
16be0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
16bf0 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
16c00 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
16c10 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
16c20 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
16c30 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
16c40 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
16c50 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
16c60 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
16c70 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
16c80 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
16c90 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
16ca0 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
16cb0 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
16cc0 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
16cd0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
16ce0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16cf0 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16d00 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16d10 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16d20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16d30 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16d40 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16d50 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16d60 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16d80 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
16d90 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16da0 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
16db0 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
16dc0 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
16dd0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
16de0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16df0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16e00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16e10 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16e20 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16e30 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16e40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16e50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16e60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16e70 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16e80 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
16e90 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
16ea0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
16eb0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
16ec0 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
16ed0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
16ee0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16ef0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16f00 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16f10 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16f20 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16f30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16f40 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16f50 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16f60 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16f70 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16f80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
16f90 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16fa0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
16fb0 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
16fc0 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
16fd0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
16fe0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16ff0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
17000 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
17010 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
17020 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
17030 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
17040 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
17050 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
17060 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
17070 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17080 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
170a0 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
170b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
170c0 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
170d0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
170e0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
170f0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
17100 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
17110 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
17120 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
17130 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
17140 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
17150 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
17160 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
17170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17180 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17190 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
171a0 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
171b0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
171c0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
171d0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
171e0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
171f0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17200 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17210 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
17220 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17230 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
17240 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
17250 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
17260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17270 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
172a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
172b0 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
172c0 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
172d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
172e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
172f0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17300 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
17310 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17320 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17330 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17340 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17350 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17360 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17370 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17380 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
17390 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
173a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
173b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
173c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
173d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
173e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
173f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17400 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17410 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17420 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17430 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17440 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17450 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17460 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17470 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17480 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
17490 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
174a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
174b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
174c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
174d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
174e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
174f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17500 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17510 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17520 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17530 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17540 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17560 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17570 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17580 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17590 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
175a0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
175b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
175c0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
175d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
175e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
175f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17600 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17620 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17630 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17640 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17660 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
17670 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
17680 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
17690 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
176a0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
176b0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
176c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
176d0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
176e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
176f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
17700 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
17710 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
17720 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
17730 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
17740 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
17750 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17760 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
17770 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
17780 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
17790 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
177a0 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
177b0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
177c0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
177d0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
177e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
177f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17800 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
17810 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
17820 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
17830 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
17840 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
17850 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
17860 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
17870 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
17880 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
17890 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
178a0 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
178b0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
178c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
178d0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
178e0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
178f0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
17900 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17910 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17920 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
17930 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
17940 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17950 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
17960 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
17970 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
17980 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
17990 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
179a0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
179b0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
179c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
179d0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
179e0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
179f0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
17a00 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
17a10 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
17a20 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
17a30 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
17a40 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
17a50 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
17a60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
17a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
17a80 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73  avepnt );.    as
17a90 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17aa0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17ab0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d  LFLAG_ROLLBACK)=
17ac0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17ad0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
17ae0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17af0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  CK;.    rc = sql
17b00 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
17b10 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
17b20 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
17b30 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
17b40 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
17b50 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d  FLAG_ROLLBACK)!=
17b60 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17b70 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
17b80 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17b90 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  CK;.    if( rc!=
17ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17bb0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e  rn rc;.    pPg->
17bc0 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
17bd0 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
17be0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17bf0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
17c00 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
17c10 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
17c20 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
17c30 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
17c40 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
17c50 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
17c60 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
17c70 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
17c80 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
17c90 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
17ca0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
17cb0 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
17cc0 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
17cd0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
17ce0 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
17cf0 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
17d00 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
17d10 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
17d20 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
17d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
17d40 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
17d50 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
17d60 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
17d70 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
17d80 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
17d90 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
17da0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
17db0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
17dc0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73  pPg);.    if( is
17dd0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
17de0 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
17df0 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
17e00 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
17e10 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
17e20 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
17e30 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
17e40 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
17e50 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
17e60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17e70 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
17e80 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
17e90 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
17ea0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17eb0 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
17ec0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
17ed0 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
17ee0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
17ef0 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
17f00 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
17f10 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
17f20 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ut to the.      
17f30 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
17f40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17f50 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
17f60 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
17f70 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
17f80 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
17f90 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
17fa0 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
17fb0 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
17fc0 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
17fd0 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
17fe0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
17ff0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18000 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
18010 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
18020 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
18030 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
18040 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
18050 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
18060 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
18070 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
18080 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
18090 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
180a0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
180b0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
180c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
180d0 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
180e0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
180f0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
18100 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
18110 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
18120 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
18130 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18140 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
18150 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
18160 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
18170 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
18180 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
18190 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
181a0 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
181b0 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
181c0 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
181d0 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
181e0 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
181f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
18200 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
18210 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
18220 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
18230 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
18240 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
18250 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
18260 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
18270 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
18280 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
18290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
182a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
182b0 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r) );.      sqli
182c0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
182d0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
182e0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
182f0 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20  ehash(pPg);..   
18300 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
18310 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
18320 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
18330 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
18340 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
18350 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
18360 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
18370 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
18380 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
18390 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
183a0 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
183b0 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
183c0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
183d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
183e0 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
183f0 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
18400 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
18410 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
18420 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
18430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
18440 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
18450 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
18460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18470 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
18480 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
18490 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
184a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
184b0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
184c0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
184d0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
184e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
184f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
18500 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
18510 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
18520 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
18530 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
18540 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18550 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
18560 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
18570 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
18580 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
18590 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
185a0 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
185b0 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
185c0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
185d0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
185e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
185f0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
18600 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
18610 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
18620 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
18630 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
18640 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
18650 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
18660 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
18670 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
18680 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
18690 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
186a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
186b0 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
186c0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
186d0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
186e0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
186f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
18700 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
18710 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
18720 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
18730 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
18740 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
18750 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
18760 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
18770 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
18780 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
18790 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
187a0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
187b0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
187c0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
187d0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
187e0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
187f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
18800 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
18810 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18820 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
18830 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
18840 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
18850 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
18860 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18870 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
18880 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
18890 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
188a0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
188b0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
188c0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
188d0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
188e0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
188f0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
18900 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
18910 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
18920 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
18930 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
18940 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18950 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
18960 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
18970 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
18980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18990 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
189a0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
189b0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
189c0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
189d0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
189e0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
189f0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
18a00 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
18a10 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
18a20 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
18a30 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
18a40 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
18a50 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
18a60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
18a70 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
18a80 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
18a90 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
18aa0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
18ab0 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
18ac0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
18ad0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
18ae0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
18af0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
18b00 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
18b10 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
18b20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
18b30 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
18b40 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
18b50 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
18b60 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
18b70 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
18b80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18b90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18ba0 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18bb0 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18bc0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18bd0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18be0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18bf0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18c00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18c10 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
18c20 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
18c30 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
18c40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
18c50 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
18c60 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18c90 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18ca0 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18cb0 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18cd0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18ce0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18cf0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18d00 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
18d10 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18d20 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
18d30 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
18d40 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
18d50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18d60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
18d70 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
18d80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
18d90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18da0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
18db0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
18dc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
18dd0 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
18de0 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
18df0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
18e00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
18e10 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
18e20 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
18e30 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
18e40 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
18e50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
18e60 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
18e70 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
18e80 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
18e90 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
18ea0 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
18eb0 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
18ec0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18ed0 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
18ee0 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
18ef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18f00 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
18f10 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
18f20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18f30 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
18f40 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
18f50 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
18f60 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
18f70 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
18f80 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
18f90 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
18fa0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
18fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
18fd0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
18fe0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
18ff0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19000 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
19010 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19020 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19030 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19040 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19050 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19060 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19070 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
19080 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
19090 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
190a0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
190b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
190c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
190d0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
190e0 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
190f0 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
19100 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
19110 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19120 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19130 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19140 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19150 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19160 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19170 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
19180 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
19190 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
191a0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
191b0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
191c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
191d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
191e0 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
191f0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19200 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19210 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19220 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19230 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19240 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19250 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19260 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19270 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19280 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19290 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
192a0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
192b0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
192c0 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
192d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
192e0 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
192f0 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
19300 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
19310 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19320 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19330 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
19340 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19350 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
19360 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
19370 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
19380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
19390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
193a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
193b0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
193c0 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
193d0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
193e0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
193f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
19400 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
19410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19430 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19450 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
19460 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
19470 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
19480 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
19490 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
194a0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
194b0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
194c0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
194d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
194e0 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
194f0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
19500 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
19510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
19520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
19530 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
19540 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19550 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19560 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19570 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19580 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19590 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
195a0 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
195b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
195c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
195d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
195e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
195f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19600 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19610 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19620 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19630 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19640 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19650 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19670 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19680 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19690 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
196a0 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
196b0 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
196c0 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
196d0 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
196e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
196f0 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19700 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19720 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19730 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19740 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19750 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19760 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19770 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19780 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
19790 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
197a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
197b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
197c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
197d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
197e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
197f0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19800 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19810 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19820 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19830 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19840 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19850 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19860 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19870 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19880 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19890 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
198a0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
198b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
198c0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
198d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
198e0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
198f0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19910 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19920 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19930 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
19940 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19950 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19960 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19970 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19980 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
19990 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
199a0 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
199b0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
199c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
199d0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
199e0 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
199f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19a00 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19a10 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19a20 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19a30 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
19a40 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19a50 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19a60 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19a70 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19a80 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
19a90 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
19aa0 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
19ab0 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
19ac0 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
19ad0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
19ae0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
19af0 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
19b00 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
19b10 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
19b20 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
19b30 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
19b40 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
19b50 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
19b60 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
19b70 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
19b80 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
19b90 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
19ba0 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
19bb0 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
19bc0 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
19bd0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
19be0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
19bf0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
19c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
19c10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
19c20 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
19c30 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
19c40 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
19c50 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
19c60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
19c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19c80 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
19c90 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19ca0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
19cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19cc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19cd0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
19ce0 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
19cf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19d00 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
19d10 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
19d20 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
19d30 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
19d40 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
19d50 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
19d60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
19d70 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
19d80 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
19d90 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
19da0 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
19db0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19dd0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
19de0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
19df0 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
19e00 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
19e10 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
19e20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19e30 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19e40 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
19e50 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
19e60 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
19e70 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19e90 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19ea0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19eb0 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19ec0 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19ee0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
19ef0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
19f00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19f10 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
19f20 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
19f30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19f40 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19f50 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19f60 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19f70 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19f90 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
19fa0 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
19fb0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19fc0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19fd0 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
19fe0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19ff0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a000 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
1a010 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
1a020 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
1a030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a050 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a060 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1a070 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
1a080 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a0a0 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
1a0b0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
1a0c0 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
1a0d0 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
1a0e0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1a0f0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1a100 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
1a110 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
1a120 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
1a130 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
1a140 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a150 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
1a160 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
1a170 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
1a180 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
1a190 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
1a1a0 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
1a1b0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
1a1c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
1a1d0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
1a1e0 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
1a1f0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a210 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
1a220 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a230 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1a240 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a250 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a260 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a270 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a280 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a290 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1a2a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1a2b0 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1a2c0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1a2d0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1a2e0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1a2f0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1a300 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1a310 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1a320 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1a330 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1a340 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1a350 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1a360 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1a370 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a380 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1a390 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1a3a0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1a3b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a3c0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a3d0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1a3e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a3f0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a400 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a410 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a420 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a430 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a440 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a450 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a460 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a470 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a480 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1a490 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1a4a0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a4b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a4c0 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1a4d0 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1a4e0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a4f0 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1a500 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1a510 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1a520 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a530 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1a540 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1a550 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1a560 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1a570 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1a580 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1a590 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1a5a0 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1a5b0 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1a5c0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a5d0 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1a5e0 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1a5f0 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1a600 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a610 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1a620 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1a630 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1a640 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1a650 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1a660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a670 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1a680 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1a690 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1a6a0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1a6b0 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1a6c0 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1a6d0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1a6e0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1a6f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a700 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1a710 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1a720 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a730 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1a740 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a750 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a760 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1a770 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1a780 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a790 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1a7a0 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1a7b0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1a7c0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a7d0 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1a7e0 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1a7f0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1a800 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1a810 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1a820 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1a830 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1a840 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1a850 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a860 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1a870 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a880 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1a890 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1a8a0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1a8b0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a8c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a8d0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a8e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a8f0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a900 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a910 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a920 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a930 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a940 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a950 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a960 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a970 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a980 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a990 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a9a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a9b0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a9c0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a9d0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a9e0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a9f0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1aa00 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1aa10 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1aa20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1aa30 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1aa40 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1aa50 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1aa60 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1aa70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1aa80 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1aa90 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1aaa0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1aab0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1aac0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1aad0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1aae0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1aaf0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1ab00 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1ab10 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1ab20 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1ab30 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1ab40 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1ab50 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1ab60 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1ab70 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1ab80 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1ab90 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1aba0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1abb0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1abc0 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1abd0 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1abe0 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1abf0 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1ac00 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1ac10 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1ac20 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1ac30 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1ac40 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1ac50 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1ac60 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1ac70 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1ac80 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1ac90 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1aca0 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1acb0 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1acc0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1acd0 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1ace0 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1acf0 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1ad00 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1ad10 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1ad20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1ad30 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1ad40 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1ad50 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1ad60 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1ad70 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1ad80 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1ad90 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1ada0 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1adb0 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1adc0 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1add0 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1ade0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1adf0 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1ae00 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1ae10 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1ae20 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1ae30 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1ae40 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1ae50 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1ae60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ae70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1ae80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1ae90 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1aea0 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1aeb0 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1aec0 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1aed0 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1aee0 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1aef0 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1af00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1af10 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1af20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1af30 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1af40 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1af50 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1af60 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1af70 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1af80 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1af90 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1afa0 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1afb0 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1afc0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1afd0 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1afe0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1aff0 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1b000 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1b010 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1b020 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1b030 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1b040 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1b050 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1b060 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1b070 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1b080 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1b090 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1b0a0 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1b0b0 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1b0c0 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1b0d0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1b0e0 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1b0f0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1b100 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1b110 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1b120 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1b130 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1b140 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1b150 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1b160 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1b170 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b180 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1b190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1b1a0 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1b1b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b1c0 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1b1d0 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1b1e0 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1b1f0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1b200 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1b210 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1b220 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1b230 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1b240 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b250 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b260 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b270 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b280 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1b290 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b2a0 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1b2b0 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1b2c0 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1b2d0 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1b2e0 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1b2f0 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1b300 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1b310 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1b320 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1b330 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1b340 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b350 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1b360 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1b370 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1b380 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1b390 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1b3a0 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1b3b0 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1b3c0 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1b3d0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1b3e0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b3f0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b400 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b410 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b420 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b430 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b450 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b460 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b470 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1b4a0 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1b4b0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b4e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1b4f0 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1b500 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b510 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1b520 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1b530 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b550 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1b560 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b570 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1b580 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b590 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1b5a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1b5b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1b5c0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1b5d0 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1b5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1b5f0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1b600 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1b610 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1b620 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1b630 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1b640 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1b650 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1b660 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1b670 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1b680 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1b690 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1b6a0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b6b0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b6c0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b6d0 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b6e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b6f0 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b700 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b710 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b720 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b730 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b740 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b760 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b770 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b780 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b790 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b7a0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b7b0 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b7c0 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b7d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b7e0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b7f0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b800 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b810 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b820 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b830 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b840 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b850 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b860 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b870 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b890 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b8a0 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b8b0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b8c0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b8d0 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b8e0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b8f0 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b900 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b910 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b920 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b930 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b940 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b950 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b960 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b970 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b980 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b990 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b9a0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b9b0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b9c0 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b9d0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b9e0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b9f0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1ba00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1ba10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba20 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1ba30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ba40 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1ba50 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1ba60 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1ba70 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1ba80 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1ba90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1baa0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1bab0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1bac0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1bad0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1bae0 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1baf0 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1bb00 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1bb10 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1bb20 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1bb30 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1bb40 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1bb50 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1bb60 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1bb70 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1bb80 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1bb90 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1bba0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1bbb0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1bbc0 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1bbd0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1bbe0 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1bbf0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1bc00 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1bc10 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1bc20 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1bc30 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1bc40 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1bc50 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1bc60 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1bc70 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1bc80 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1bc90 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1bca0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1bcb0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1bcc0 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1bcd0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1bce0 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1bcf0 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1bd00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bd10 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1bd30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bd40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bd50 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1bd60 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bd70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1bd80 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1bd90 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1bda0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1bdb0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1bdc0 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1bdd0 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1bde0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1bdf0 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1be00 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1be10 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1be20 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1be30 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1be40 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1be50 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1be60 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1be70 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1be80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1be90 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1bea0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1beb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bec0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1bed0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1bee0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bef0 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1bf00 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bf10 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1bf20 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1bf30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1bf40 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1bf50 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1bf60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1bf70 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1bf80 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1bf90 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1bfa0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1bfb0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1bfc0 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1bfd0 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1bfe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1bff0 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1c000 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1c010 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1c020 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1c030 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1c040 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1c050 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1c060 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1c070 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1c080 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1c090 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1c0a0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1c0b0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1c0c0 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1c0d0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1c0e0 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1c0f0 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1c100 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1c110 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1c120 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1c130 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1c140 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1c150 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1c160 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1c170 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1c180 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1c190 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1c1a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1c1b0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c1c0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1c1d0 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1c1e0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1c1f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1c200 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1c210 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1c220 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1c230 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c240 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1c250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1c260 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c270 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1c280 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1c290 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1c2a0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1c2b0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1c2c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1c2d0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c2e0 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1c2f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1c300 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c310 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1c320 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1c330 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1c340 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1c350 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1c360 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1c370 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1c380 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1c390 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c3a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c3b0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1c3c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1c3d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1c3e0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1c3f0 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1c400 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1c420 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c440 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c450 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1c460 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1c470 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1c480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1c490 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1c4a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c4b0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1c4c0 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1c4d0 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1c4e0 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1c4f0 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1c500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1c510 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c520 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1c530 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1c540 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c550 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c560 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1c570 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1c580 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1c590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1c5b0 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1c5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c5e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c5f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c600 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1c610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c620 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c630 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c640 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c660 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1c670 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1c680 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1c690 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1c6a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1c6b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1c6c0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1c6d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1c6e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1c6f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1c700 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1c710 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1c720 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1c730 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1c740 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1c750 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1c760 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1c770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1c780 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1c790 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1c7a0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1c7b0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1c7c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1c7e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c7f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c800 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1c810 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1c820 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1c830 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1c840 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c850 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1c860 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1c870 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1c880 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1c890 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1c8a0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1c8b0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1c8c0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1c8d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c8e0 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1c8f0 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1c900 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1c910 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1c920 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c930 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c940 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c950 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c960 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1c970 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1c980 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1c990 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1c9a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1c9b0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c9c0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1c9d0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1c9e0 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1c9f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1ca00 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1ca10 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1ca20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1ca30 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1ca40 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1ca50 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1ca60 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1ca70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ca80 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1ca90 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1caa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1cab0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1cac0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1cad0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1cae0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1caf0 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1cb00 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1cb10 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1cb20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1cb30 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1cb40 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1cb50 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1cb60 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1cb70 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1cb80 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1cb90 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cba0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1cbb0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1cbc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1cbd0 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1cbe0 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1cbf0 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1cc00 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1cc10 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1cc20 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1cc30 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1cc40 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1cc50 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1cc60 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1cc70 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1cc80 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1cc90 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1cca0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ccb0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1ccc0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1ccd0 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1cce0 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1ccf0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1cd00 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1cd10 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1cd20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1cd30 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1cd40 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1cd50 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1cd60 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1cd70 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1cd80 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1cd90 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1cda0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cdb0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1cdc0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1cdd0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1cde0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1cdf0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1ce00 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1ce10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1ce20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ce30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ce40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ce50 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1ce60 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1ce70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1ce80 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1ce90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1cea0 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1ceb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1cec0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1ced0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1cef0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1cf00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1cf10 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1cf20 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1cf30 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cf40 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cf50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cf60 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1cf70 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1cf80 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1cf90 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1cfa0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1cfb0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1cfc0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1cfd0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1cfe0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1cff0 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1d000 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1d010 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1d020 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1d030 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d050 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1d060 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1d070 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1d080 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1d090 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1d0a0 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1d0b0 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1d0c0 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1d0d0 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1d0e0 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1d0f0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1d100 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1d110 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1d120 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1d130 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1d140 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1d150 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1d160 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1d170 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1d180 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1d190 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1d1a0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1d1b0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1d1c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1d1d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1d1e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1d1f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1d200 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1d210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d220 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1d230 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1d240 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1d250 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1d260 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d270 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1d280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d290 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1d2a0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1d2b0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1d2c0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1d2d0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1d2e0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1d2f0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1d300 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1d310 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d320 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1d330 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1d340 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1d350 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1d360 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1d370 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1d380 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1d390 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1d3a0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1d3b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d3c0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1d3d0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1d3e0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1d3f0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1d400 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1d410 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1d420 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1d430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d440 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d450 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d460 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1d470 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1d480 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d490 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1d4a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d4b0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1d4c0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1d4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1d4e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d4f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d500 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1d510 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1d520 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1d530 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1d540 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1d550 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1d560 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d570 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d580 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d590 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d5a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d5b0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d5c0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d5d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d5e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d5f0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d600 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d610 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d630 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d640 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d660 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d670 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d680 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d690 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d6a0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d6b0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d6c0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d6d0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d6e0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d6f0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d700 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d710 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d720 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d740 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d750 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d760 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d770 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d780 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d790 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d7a0 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d7b0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d7c0 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d7d0 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d7e0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d7f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d800 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d810 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d820 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d830 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d840 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d850 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d860 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d870 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d880 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d890 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d8a0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d8b0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d8c0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d8d0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d8e0 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1d8f0 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1d900 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1d910 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1d920 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1d930 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1d940 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1d950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d960 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1d970 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d980 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1d990 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1d9a0 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1d9b0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1d9c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d9d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d9e0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d9f0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1da00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1da10 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1da20 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1da30 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
1da40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
1da50 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1da60 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1da70 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1da80 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1da90 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1daa0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1dab0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1dac0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1dad0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1dae0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1daf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1db10 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1db20 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1db30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1db40 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1db50 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1db60 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1db70 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1db80 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1db90 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1dba0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1dbb0 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1dbc0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1dbd0 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1dbe0 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1dbf0 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1dc00 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1dc10 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1dc20 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1dc30 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1dc40 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1dc50 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1dc60 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1dc70 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1dc80 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1dc90 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1dca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dcb0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1dcc0 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1dcd0 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1dce0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1dcf0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1dd00 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1dd10 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1dd20 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1dd30 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1dd40 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1dd50 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1dd60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1dd70 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1dd80 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1dd90 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1dda0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1ddb0 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1ddc0 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1ddd0 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1dde0 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1ddf0 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1de00 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1de10 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1de20 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1de30 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1de40 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1de50 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1de60 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1de70 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1de80 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1de90 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1dea0 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1deb0 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1dec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1ded0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1dee0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1def0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1df00 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1df10 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1df20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1df30 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1df40 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1df50 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1df60 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1df70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1df80 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1df90 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1dfa0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1dfb0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1dfc0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1dfd0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1dfe0 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1dff0 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1e000 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1e010 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1e020 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1e030 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1e040 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1e050 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1e060 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1e070 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1e080 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1e090 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1e0a0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1e0b0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1e0c0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1e0d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e0e0 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1e0f0 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1e100 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1e110 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1e120 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1e130 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1e140 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1e150 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1e160 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1e170 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1e180 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1e190 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1e1a0 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1e1b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e1c0 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1e1d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1e1e0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1e1f0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1e200 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1e210 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1e220 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1e230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1e240 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1e250 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1e260 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1e270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e280 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1e290 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1e2a0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1e2b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e2d0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1e2e0 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1e2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e310 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e320 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1e330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e340 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e350 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1e360 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1e370 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1e380 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e390 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1e3a0 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1e3b0 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1e3c0 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1e3d0 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1e3e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1e3f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1e400 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1e410 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1e420 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1e430 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1e440 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1e450 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1e460 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1e470 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1e480 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1e490 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1e4a0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1e4b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1e4c0 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1e4d0 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1e4e0 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1e4f0 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1e500 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1e510 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1e520 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1e530 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1e540 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1e550 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1e560 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1e570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e580 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e590 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1e5a0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1e5b0 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1e5c0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1e5d0 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1e5e0 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1e5f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e620 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1e630 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e650 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1e660 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1e670 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1e680 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1e690 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1e6a0 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1e6b0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1e6c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1e6d0 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1e6e0 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1e6f0 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1e700 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1e710 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1e720 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1e730 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1e740 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1e750 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1e760 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1e770 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1e780 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1e790 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1e7a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1e7b0 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1e7c0 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1e7d0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1e7e0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1e7f0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1e800 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e810 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1e820 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1e830 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1e840 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1e850 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1e860 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1e870 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1e880 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1e890 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1e8a0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1e8b0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1e8c0 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1e8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e8e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e8f0 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1e900 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1e910 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1e920 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1e930 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e940 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1e950 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1e960 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1e970 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1e980 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1e990 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1e9a0 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1e9b0 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1e9c0 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1e9d0 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1e9e0 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1e9f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ea00 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1ea10 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1ea20 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1ea30 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1ea40 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1ea50 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1ea60 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1ea70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1ea80 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1ea90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1eab0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1eac0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1eaf0 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1eb00 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb20 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1eb30 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1eb40 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1eb50 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1eb60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1eb70 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1eb80 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1eb90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ebb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1ebc0 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ebf0 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1ec00 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1ec30 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1ec40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ec50 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1ec60 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1ec70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1ec80 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1ec90 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1eca0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1ecb0 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1ecc0 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1ecd0 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1ece0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1ecf0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1ed00 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1ed10 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1ed20 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1ed30 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1ed40 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1ed50 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1ed60 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ed70 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1ed80 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1ed90 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1eda0 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1edb0 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1edc0 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1edd0 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1ede0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1edf0 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1ee00 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1ee10 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1ee20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1ee30 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1ee40 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1ee50 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1ee60 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ee70 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1ee80 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1ee90 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1eea0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1eeb0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1eec0 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1eed0 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1eee0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1eef0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1ef00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ef10 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1ef20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1ef30 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1ef40 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1ef50 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1ef60 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1ef70 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1ef80 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1ef90 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1efa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1efb0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1efc0 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1efd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1efe0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1eff0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1f000 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1f010 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1f020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1f030 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1f040 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1f050 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1f060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1f070 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1f080 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1f090 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1f0a0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1f0b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f0c0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1f0d0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1f0e0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1f0f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1f100 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1f110 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f120 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1f130 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1f140 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1f150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1f160 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1f170 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1f180 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f190 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1f1a0 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1f1b0 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1f1c0 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1f1d0 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1f1e0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1f1f0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1f200 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1f210 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1f220 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1f230 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1f240 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1f250 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1f260 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1f270 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1f280 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1f290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f2a0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1f2b0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1f2c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f2f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f300 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f320 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1f330 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1f340 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1f350 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f370 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f380 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1f390 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f3a0 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1f3b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f3c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1f3d0 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1f3e0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1f3f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f400 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f410 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1f420 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1f430 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1f440 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1f450 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1f460 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1f470 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1f480 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1f490 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1f4a0 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1f4b0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f4c0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f4d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f4e0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1f4f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f500 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1f510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f520 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1f530 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1f540 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f550 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f560 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f570 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1f580 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1f590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f5a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f5b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f5c0 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1f5d0 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1f5e0 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1f5f0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1f600 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1f610 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1f620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f630 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1f640 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1f650 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1f660 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1f670 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1f680 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1f690 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1f6a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1f6b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f6c0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1f6d0 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1f6e0 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1f6f0 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1f700 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1f710 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f720 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1f730 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1f740 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1f750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f760 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1f770 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f780 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1f790 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f7b0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1f7c0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1f7d0 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1f7e0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1f7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f800 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1f810 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1f820 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1f830 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1f840 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1f850 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1f860 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1f870 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1f880 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1f890 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f8a0 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1f8b0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1f8c0 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1f8d0 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1f8e0 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1f8f0 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1f900 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1f910 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1f920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f930 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f950 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f960 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1f970 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1f980 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1f990 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1f9a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1f9b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1f9c0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1f9d0 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
1f9e0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1f9f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
1fa00 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64  age counte based
1fa10 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
1fa20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1fa30 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
1fa40 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1fa50 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1fa60 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
1fa70 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1fa80 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
1fa90 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
1faa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1fab0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1fac0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1fad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fae0 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1faf0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1fb00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1fb10 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1fb20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1fb30 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1fb40 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1fb50 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1fb60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1fb70 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
1fb80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fb90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fbb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1fbc0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
1fbd0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1fbe0 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
1fbf0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
1fc00 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1fc10 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1fc20 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1fc30 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1fc40 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1fc50 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1fc60 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1fc70 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1fc80 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1fc90 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1fca0 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1fcb0 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1fcc0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1fcd0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1fce0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1fcf0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1fd00 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1fd10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1fd20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fd30 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1fd40 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1fd50 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1fd60 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1fd70 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1fd80 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1fd90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fda0 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1fdb0 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1fdc0 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1fdd0 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1fde0 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1fdf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fe00 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1fe10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fe20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1fe30 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fe40 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1fe50 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1fe60 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1fe70 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1fe80 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1fe90 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1fea0 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1feb0 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1fec0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1fed0 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1fee0 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1fef0 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1ff00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ff10 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1ff20 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1ff30 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1ff40 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1ff50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ff60 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1ff70 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1ff80 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1ff90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1ffa0 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1ffb0 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1ffc0 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1ffd0 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1ffe0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1fff0 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
20000 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
20010 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
20020 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
20030 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
20040 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
20050 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
20060 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
20070 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
20080 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
20090 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
200a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
200b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
200c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
200d0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
200e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
200f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
20100 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
20110 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
20120 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20140 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
20150 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
20160 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20180 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
20190 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
201a0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
201b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
201c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
201d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
201e0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
201f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20200 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
20210 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20220 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
20230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20240 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
20250 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
20260 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
20270 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
20280 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
20290 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
202a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
202b0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
202c0 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
202d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
202e0 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
202f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20310 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
20320 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20330 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
20340 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
20350 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
20360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20370 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
20380 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20390 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
203a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
203b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
203c0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
203d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203e0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
203f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
20400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20410 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20420 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20430 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
20440 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
20450 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
20460 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
20470 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
20480 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
20490 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
204a0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
204b0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
204c0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
204d0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
204e0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
204f0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
20500 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
20510 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
20520 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
20530 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
20540 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
20550 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
20560 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
20570 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
20580 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
20590 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
205a0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
205b0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
205c0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
205d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
205e0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
205f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20600 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20610 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
20620 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
20630 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
20640 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
20650 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20660 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20670 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
20680 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20690 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
206a0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
206b0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
206c0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
206d0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
206e0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
206f0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
20700 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
20710 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
20720 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
20730 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
20740 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
20750 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
20760 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20770 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
20780 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20790 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
207a0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
207b0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
207c0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
207d0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
207e0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
207f0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
20800 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
20810 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20820 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
20830 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
20840 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
20850 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
20860 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
20870 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
20880 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
20890 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
208a0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
208b0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
208c0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
208d0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
208e0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
208f0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
20900 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
20910 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
20920 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
20930 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
20940 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
20950 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
20960 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
20970 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
20980 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
20990 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
209a0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
209b0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
209c0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
209d0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
209e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
209f0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
20a00 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
20a10 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
20a20 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
20a30 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
20a40 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
20a50 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
20a60 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
20a70 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
20a80 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
20a90 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20aa0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20ab0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
20ac0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
20ad0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
20ae0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
20af0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
20b00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
20b10 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
20b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20b30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
20b40 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
20b50 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
20b60 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
20b70 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20b80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
20b90 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
20ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20bb0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
20bc0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
20bd0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
20be0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20bf0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
20c00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
20c10 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
20c20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
20c30 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
20c40 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
20c50 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
20c60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20c70 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
20c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20c90 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
20ca0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
20cb0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
20cc0 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
20cd0 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
20ce0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
20cf0 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
20d00 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
20d10 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
20d20 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
20d30 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20d40 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
20d50 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
20d60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20d80 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
20d90 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
20da0 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
20db0 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
20dc0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
20dd0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
20de0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
20df0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
20e00 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
20e10 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
20e20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20e30 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
20e40 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20e50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20e60 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
20e70 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
20e80 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20e90 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
20ea0 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
20eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
20ec0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20ed0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
20ee0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20ef0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
20f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
20f10 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
20f20 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
20f30 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
20f40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20f50 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
20f60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20f70 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
20f80 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
20f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20fa0 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
20fb0 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
20fc0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
20fd0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
20fe0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
20ff0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
21000 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
21010 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
21020 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
21030 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21040 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21050 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
21060 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21070 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21080 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21090 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
210a0 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
210b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
210c0 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
210d0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
210e0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
210f0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
21100 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
21110 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
21120 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
21130 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
21140 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
21150 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
21160 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
21170 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
21180 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21190 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
211a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
211b0 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
211c0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
211d0 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
211e0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
211f0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
21200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
21210 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
21220 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
21230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21240 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21250 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
21260 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21270 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21280 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
212a0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
212b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
212c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
212d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
212e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
212f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21300 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21310 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
21320 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21330 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21340 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
21350 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21360 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
21370 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
21380 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
21390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
213a0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
213b0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
213c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
213d0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
213e0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
213f0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21400 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21420 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21430 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
21440 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21450 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21460 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
21470 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21490 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
214a0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
214b0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
214c0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
214d0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
214e0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
214f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21500 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21510 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
21520 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21530 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21540 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21550 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
21560 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
21570 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21580 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21590 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
215a0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
215b0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
215c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
215d0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
215e0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
215f0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21600 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21610 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21620 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21630 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
21640 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
21650 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
21660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
21670 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21680 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21690 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
216a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
216b0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
216c0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
216d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
216e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
216f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21700 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21710 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21720 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21730 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21740 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
21750 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21760 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
21770 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21780 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21790 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
217a0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
217b0 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
217c0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
217d0 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
217e0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
217f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21800 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21810 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
21820 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
21830 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21840 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
21850 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21860 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
21870 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21890 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
218a0 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
218b0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
218c0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
218d0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
218e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
218f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21900 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
21910 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
21920 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
21930 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
21940 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
21950 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21960 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21970 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
21980 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
21990 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
219a0 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
219b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
219c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
219d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
219e0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
219f0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
21a00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21a10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21a20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
21a30 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21a40 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
21a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21a60 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
21a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
21a80 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
21a90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21aa0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21ab0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21ac0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21ad0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
21ae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21af0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
21b00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21b10 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
21b20 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
21b30 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
21b40 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
21b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
21b60 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
21b70 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
21b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
21b90 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
21ba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
21bb0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
21bc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
21bd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21be0 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
21bf0 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
21c00 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
21c10 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
21c20 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
21c30 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
21c40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
21c50 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
21c60 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
21c70 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21c80 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
21c90 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
21ca0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
21cb0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
21cc0 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
21cd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
21ce0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21cf0 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
21d00 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
21d10 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
21d20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21d30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21d40 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
21d50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
21d60 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
21d70 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
21d80 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
21d90 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
21da0 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
21db0 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
21dc0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
21dd0 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
21de0 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
21df0 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
21e00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21e10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21e20 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
21e30 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
21e40 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
21e50 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
21e60 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
21e70 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
21e80 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21e90 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
21ea0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
21eb0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
21ec0 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
21ed0 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
21ee0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
21ef0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
21f00 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
21f10 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
21f20 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
21f30 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
21f40 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
21f50 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
21f60 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21f70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21f80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21f90 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21fa0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21fb0 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21fc0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21fd0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21fe0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21ff0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22000 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22010 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
22020 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22030 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22040 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
22050 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
22060 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22070 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22080 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
22090 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
220a0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
220b0 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
220c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
220d0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
220e0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
220f0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22100 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
22110 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
22120 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
22130 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
22140 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
22160 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
22170 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
22180 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
22190 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
221a0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
221b0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
221c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
221d0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
221e0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
221f0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22200 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
22210 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
22220 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
22230 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
22240 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
22250 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
22260 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
22270 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22280 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22290 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
222a0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
222b0 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
222c0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
222d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
222e0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
222f0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22300 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22310 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
22320 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
22330 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
22340 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
22350 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
22360 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
22370 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
22380 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
22390 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
223a0 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
223b0 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
223c0 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
223d0 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
223e0 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
223f0 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22400 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
22410 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
22420 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22430 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
22440 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
22450 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
22460 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
22470 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22480 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22490 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
224a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
224b0 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
224c0 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
224d0 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
224e0 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
224f0 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22500 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
22510 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
22520 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
22530 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
22540 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
22550 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
22560 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
22570 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22580 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22590 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
225a0 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
225b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
225c0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
225d0 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
225e0 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
225f0 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22600 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
22610 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
22620 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
22630 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
22640 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
22650 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
22660 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22670 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22680 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22690 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
226a0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
226b0 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
226c0 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
226d0 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
226e0 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
226f0 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22700 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
22710 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
22720 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
22730 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
22740 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
22750 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
22760 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
22770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22780 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22790 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
227a0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
227b0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
227c0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
227d0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
227e0 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
227f0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
22800 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22810 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
22820 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
22830 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
22840 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
22850 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
22860 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
22870 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
22880 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22890 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
228a0 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
228b0 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
228c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
228d0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
228e0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
228f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22900 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22910 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22920 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22930 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22940 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22950 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22960 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22970 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22980 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22990 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
229a0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
229b0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
229c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
229d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
229e0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
229f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22a00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22a10 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22a20 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22a30 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22a40 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22a50 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22a60 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22a70 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22a80 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22a90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22aa0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ab0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22ac0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22ad0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ae0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22af0 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22b00 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22b10 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22b20 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22b30 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22b40 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22b50 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
22b60 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
22b70 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22b80 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
22b90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22ba0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22bb0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
22bc0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
22bd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
22be0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22bf0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22c00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22c10 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
22c20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
22c30 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
22c40 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
22c50 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
22c60 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
22c70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
22c80 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
22c90 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22ca0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
22cb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
22cc0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
22cd0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
22ce0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
22cf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22d00 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
22d10 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22d20 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
22d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22d40 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
22d50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
22d60 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
22d70 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
22d80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22d90 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
22da0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
22db0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
22dc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22dd0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
22de0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
22df0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
22e00 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
22e10 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
22e20 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
22e30 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22e40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22e50 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
22e60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22e70 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
22e80 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22e90 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22ea0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22eb0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
22ec0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
22ed0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22ef0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22f00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22f10 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
22f20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22f30 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
22f40 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
22f50 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
22f60 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
22f70 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
22f80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22f90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22fa0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
22fb0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
22fc0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22fd0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
22fe0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22ff0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23000 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23010 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
23020 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
23030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23040 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
23050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23060 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
23070 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23080 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
23090 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
230a0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
230b0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
230c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
230d0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
230e0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
230f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23100 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
23110 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
23120 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
23130 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
23140 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
23150 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
23160 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
23170 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
23180 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23190 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
231a0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
231b0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
231c0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
231d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
231e0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
231f0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23200 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23210 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23220 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23230 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
23240 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
23250 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
23260 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
23270 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23280 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23290 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
232a0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
232b0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
232e0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
232f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23320 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23330 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
23340 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
23350 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
23360 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
23370 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23380 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23390 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
233a0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
233b0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
233c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
233d0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
233e0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
233f0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23400 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23410 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23420 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23430 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23440 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23450 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23460 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23470 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23480 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23490 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
234a0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
234b0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
234c0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
234d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
234e0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
234f0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23500 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23510 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23520 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23530 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23540 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23550 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23560 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23570 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23580 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23590 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
235a0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
235b0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
235c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
235d0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
235e0 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
235f0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23600 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23610 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23620 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23630 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23640 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23650 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23660 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23670 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23680 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23690 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
236a0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
236b0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
236c0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
236d0 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
236e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
236f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23700 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23710 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23720 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23730 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23740 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
23750 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
23760 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
23770 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23780 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23790 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
237a0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
237b0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
237c0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
237d0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
237e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
237f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23800 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23810 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23820 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23830 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
23840 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23850 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
23860 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
23870 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23880 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23890 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
238a0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
238b0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
238c0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
238d0 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
238e0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
238f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23900 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23910 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23920 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23930 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
23940 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
23950 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
23960 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23970 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23980 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23990 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
239a0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
239b0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
239c0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
239d0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
239e0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
239f0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23a00 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23a10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23a20 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23a30 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
23a40 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
23a50 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
23a60 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
23a70 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23a80 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23a90 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23aa0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23ab0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23ac0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23ad0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23ae0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23af0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23b00 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23b10 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23b20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23b30 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
23b40 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
23b50 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23b60 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
23b70 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
23b80 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
23b90 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23ba0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23bb0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
23bc0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
23bd0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
23be0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
23bf0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
23c00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
23c10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23c20 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
23c30 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
23c40 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
23c50 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
23c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23c70 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
23c80 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
23c90 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
23ca0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
23cb0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
23cc0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
23cd0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
23ce0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
23cf0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
23d00 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
23d10 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
23d20 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
23d30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
23d40 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
23d50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
23d60 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
23d70 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
23d80 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
23d90 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
23da0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23db0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
23dc0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
23dd0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
23de0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
23df0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
23e00 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
23e10 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
23e20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
23e30 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
23e40 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
23e50 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
23e60 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
23e70 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
23e80 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
23e90 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
23ea0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
23eb0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
23ec0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
23ed0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
23ee0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23ef0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
23f00 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
23f10 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
23f20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
23f30 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
23f40 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
23f50 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
23f60 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
23f70 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
23f80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23f90 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
23fa0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
23fb0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23fd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23fe0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
23ff0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24010 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
24020 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
24030 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
24040 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
24050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24060 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
24070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24080 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24090 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
240a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
240b0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
240c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
240d0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
240e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
240f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24100 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24110 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
24120 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
24130 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
24140 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
24150 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
24160 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
24170 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
24180 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24190 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
241a0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
241b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
241c0 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
241d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
241e0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
241f0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
24200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24210 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
24220 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
24230 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
24240 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
24250 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
24260 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
24270 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
24280 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
24290 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
242a0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
242b0 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
242c0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
242d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
242e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
242f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24300 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
24310 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
24320 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
24330 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
24340 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
24350 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
24360 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
24370 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
24380 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
24390 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
243a0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
243b0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
243c0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
243d0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
243e0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
243f0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
24400 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
24410 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
24420 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
24430 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
24440 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
24450 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
24460 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
24470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24480 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24490 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
244a0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
244b0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
244c0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
244d0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
244e0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
244f0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
24500 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
24510 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
24520 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
24530 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
24540 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
24550 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
24560 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
24570 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
24580 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
24590 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
245a0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
245b0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
245c0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
245d0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
245e0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
245f0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24600 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24610 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
24620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24630 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24640 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
24650 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
24660 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
24670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24680 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
24690 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
246a0 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
246b0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
246c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
246d0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
246e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
246f0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24700 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24710 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
24720 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
24730 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
24740 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
24750 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
24760 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
24770 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
24780 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24790 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
247a0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
247b0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
247c0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
247d0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
247e0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
247f0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24800 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24810 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24820 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24830 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
24840 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24850 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
24860 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
24870 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24880 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24890 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
248a0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
248b0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
248c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
248d0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
248e0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
248f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24900 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24910 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24920 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
24930 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
24940 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24950 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
24960 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
24970 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24980 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
24990 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
249a0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
249b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
249c0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
249d0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
249e0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
249f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24a00 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24a10 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
24a20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
24a30 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
24a40 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
24a50 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
24a60 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
24a70 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
24a80 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24a90 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24aa0 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24ab0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24ad0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24ae0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24af0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24b00 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24b10 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
24b20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
24b30 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
24b40 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
24b50 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
24b60 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
24b70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
24b80 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
24b90 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
24ba0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24bb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
24bc0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
24bd0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
24be0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
24bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24c00 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24c10 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
24c20 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
24c30 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
24c40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24c50 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
24c60 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
24c70 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24c80 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24c90 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24ca0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
24cb0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24cc0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
24cd0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
24ce0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
24cf0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
24d00 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24d10 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24d20 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24d30 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24d40 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24d50 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24d60 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24d70 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24d80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24d90 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24da0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
24db0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
24dc0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
24dd0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
24de0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
24df0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
24e00 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24e10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24e20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24e40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24e50 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24e60 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24e70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24e80 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24e90 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24ea0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24eb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
24ec0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
24ed0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
24ee0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
24ef0 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
24f00 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24f10 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24f20 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24f30 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24f40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24f50 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24f60 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24f70 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24f80 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24f90 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24fb0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24fc0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
24fd0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
24fe0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
24ff0 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
25000 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
25010 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
25020 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
25030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
25040 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
25050 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
25060 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
25070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25080 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
25090 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
250a0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
250b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
250c0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
250d0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
250e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
250f0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
25100 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
25110 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
25120 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
25130 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
25140 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
25150 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
25160 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
25170 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
25180 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
25190 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
251a0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
251b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
251c0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
251d0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
251e0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
251f0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
25200 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
25210 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
25220 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
25230 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
25240 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
25250 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
25260 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
25270 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
25280 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
25290 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
252c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
252d0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
252e0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
252f0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
25300 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
25310 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
25320 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
25330 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
25340 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
25350 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
25360 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
25370 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
25380 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
25390 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
253a0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
253b0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
253c0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
253d0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
253e0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
253f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
25400 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25410 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
25420 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25430 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
25440 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25450 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
25460 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
25470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
25480 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
25490 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
254a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
254b0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
254c0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
254d0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
254e0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
254f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
25500 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
25510 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25520 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
25530 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
25540 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
25550 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
25560 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
25570 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
25580 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
25590 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
255a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
255b0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
255c0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
255d0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
255e0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
255f0 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25600 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25610 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
25620 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
25630 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
25640 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
25650 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
25660 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
25670 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
25680 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
25690 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
256a0 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
256b0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
256c0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
256d0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
256e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
256f0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25700 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25710 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
25720 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
25730 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
25740 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
25750 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
25760 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
25770 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25780 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
25790 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
257a0 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
257b0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
257c0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
257d0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
257e0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
257f0 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25800 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25810 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
25820 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
25830 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
25840 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
25850 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
25860 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
25870 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25880 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
25890 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
258a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
258b0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
258c0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
258d0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
258e0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
258f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25900 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25910 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
25920 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
25930 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
25940 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
25950 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
25960 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
25970 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
25980 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25990 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
259a0 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
259b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
259c0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
259d0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
259e0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
259f0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25a00 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25a10 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
25a20 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25a30 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25a40 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
25a50 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25a60 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
25a70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
25a80 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25a90 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25aa0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25ab0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25ac0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25ad0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25ae0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25af0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25b00 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25b10 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
25b20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
25b30 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
25b40 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
25b50 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
25b60 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
25b70 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
25b80 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
25b90 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
25ba0 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
25bb0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
25bc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
25bd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
25be0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
25bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
25c00 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
25c10 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25c20 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25c30 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
25c40 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
25c50 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
25c60 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
25c70 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
25c80 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
25c90 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
25ca0 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
25cb0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
25cc0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
25cd0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
25ce0 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
25cf0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
25d00 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
25d10 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
25d20 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25d30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
25d40 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
25d50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25d60 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
25d70 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
25d80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
25d90 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
25da0 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
25db0 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
25dc0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25dd0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
25de0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
25df0 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
25e00 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
25e10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
25e20 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
25e30 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
25e40 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
25e50 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
25e60 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
25e70 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
25e80 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
25e90 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
25ea0 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
25eb0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
25ec0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
25ed0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
25ee0 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
25ef0 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
25f00 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25f10 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25f20 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
25f30 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
25f40 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
25f50 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
25f60 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
25f70 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
25f80 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
25f90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
25fa0 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
25fb0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
25fc0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
25fd0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
25fe0 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
25ff0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26000 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
26010 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
26020 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
26030 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
26040 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
26050 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
26060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26070 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
26080 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26090 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
260a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
260b0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
260c0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
260d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
260e0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
260f0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
26100 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
26110 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
26120 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
26130 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
26140 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
26150 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
26160 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
26170 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
26180 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
26190 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
261a0 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
261b0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
261c0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
261d0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
261e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
261f0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26200 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
26210 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26220 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
26230 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
26240 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
26250 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
26260 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
26270 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26290 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
262a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
262b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
262c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
262d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
262e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
262f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26310 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
26320 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
26330 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
26340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26350 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
26360 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
26370 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26380 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26390 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
263a0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
263b0 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
263c0 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
263d0 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
263e0 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
263f0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26400 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26410 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
26420 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
26430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
26440 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
26450 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26460 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
26470 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26480 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26490 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
264a0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
264b0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
264c0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
264d0 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
264e0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
264f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26500 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26510 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
26520 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
26530 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
26540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
26550 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
26560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26570 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26580 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
265b0 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
265c0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
265d0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
265e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
265f0 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26600 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26610 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
26630 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26640 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
26650 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
26660 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
26670 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
26680 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26690 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
266a0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
266b0 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
266c0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
266d0 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
266e0 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
266f0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26700 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26710 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26720 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26730 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
26740 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
26750 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
26760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26770 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26780 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26790 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
267a0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
267b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
267c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
267d0 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
267e0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
267f0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
26800 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26810 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
26820 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
26830 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
26840 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
26850 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
26860 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26870 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
26880 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
26890 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
268a0 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
268b0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
268c0 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
268d0 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
268e0 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
268f0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
26900 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
26910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26920 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
26930 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
26940 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
26950 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
26960 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
26970 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
26980 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
26990 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
269a0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
269b0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
269c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
269d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
269e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
269f0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
26a00 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
26a10 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26a20 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
26a30 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26a40 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
26a50 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
26a60 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
26a70 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
26a80 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26a90 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
26aa0 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
26ab0 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
26ac0 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
26ad0 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
26ae0 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
26af0 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
26b00 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
26b10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26b20 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
26b30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26b40 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
26b50 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
26b60 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
26b70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
26b80 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
26b90 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26ba0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26bb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
26bc0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
26bd0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
26be0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
26bf0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
26c00 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
26c10 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
26c20 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
26c30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26c40 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
26c50 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
26c60 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
26c70 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
26c80 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
26c90 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
26ca0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
26cb0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
26cc0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
26cd0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
26ce0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
26cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26d00 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
26d10 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
26d20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
26d30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26d40 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
26d50 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26d60 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
26d70 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
26d80 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
26d90 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
26da0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26db0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
26dc0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
26dd0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
26de0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
26df0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
26e00 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
26e10 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
26e20 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
26e30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26e40 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
26e50 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
26e60 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
26e70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
26e80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
26e90 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
26ea0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
26eb0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
26ec0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
26ed0 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
26ee0 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
26ef0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
26f00 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
26f10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
26f20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26f30 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
26f40 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
26f50 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
26f60 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
26f70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
26f80 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
26f90 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
26fa0 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
26fb0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
26fc0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26fd0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
26fe0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
26ff0 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
27000 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
27010 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
27020 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
27030 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
27040 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
27050 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
27060 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
27070 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
27080 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
27090 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
270a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
270b0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
270c0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
270d0 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
270e0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
270f0 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
27100 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
27110 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
27120 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
27130 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
27140 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
27150 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
27160 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
27170 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
27180 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
27190 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
271a0 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
271b0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
271c0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
271d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
271e0 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
271f0 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27200 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27210 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
27220 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
27230 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
27240 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
27250 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
27260 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
27270 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
27280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27290 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
272a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
272b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
272c0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
272d0 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
272e0 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
272f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27300 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27310 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
27320 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
27330 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
27340 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
27350 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
27360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27370 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
27380 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
27390 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
273a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
273b0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
273c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
273d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
273e0 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
273f0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27400 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27410 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
27420 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
27430 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
27440 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
27450 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
27460 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
27470 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
27480 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
27490 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
274a0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
274b0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
274c0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
274d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
274e0 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
274f0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27510 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
27520 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
27530 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
27540 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
27550 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
27560 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
27570 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
27580 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
27590 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
275a0 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
275b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
275c0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
275d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
275e0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
275f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27600 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
27610 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27620 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
27630 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
27640 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
27650 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
27660 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
27670 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
27680 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27690 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
276a0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
276b0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
276c0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
276d0 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
276e0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
276f0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27700 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27710 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
27720 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
27730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27740 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
27750 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
27760 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
27770 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
27780 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
27790 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
277a0 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
277b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
277c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
277d0 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
277e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
277f0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27800 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
27810 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
27820 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
27830 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
27840 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27850 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27860 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
27870 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
27880 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
27890 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
278a0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
278b0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
278c0 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
278d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
278e0 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
278f0 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
27900 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
27910 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
27920 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
27930 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
27940 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
27950 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
27960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27970 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
27980 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
27990 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
279a0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
279b0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
279c0 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
279d0 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
279e0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
279f0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
27a00 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
27a10 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
27a20 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
27a30 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
27a40 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
27a50 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
27a60 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
27a70 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
27a80 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27a90 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
27aa0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
27ab0 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
27ac0 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
27ad0 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
27ae0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27af0 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
27b00 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
27b10 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
27b20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
27b30 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
27b40 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
27b50 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
27b60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27b70 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
27b80 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
27b90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
27ba0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
27bb0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
27bc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
27be0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
27bf0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
27c00 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27c30 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
27c40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
27c50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27c60 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
27c70 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
27c80 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27c90 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
27ca0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
27cb0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
27cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
27cd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27ce0 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
27cf0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
27d00 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
27d10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27d20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
27d30 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
27d40 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27d50 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27d60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27d70 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
27d80 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
27d90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27da0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
27db0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
27dc0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
27dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
27de0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
27df0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
27e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
27e10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27e20 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
27e30 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27e40 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27e60 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
27e70 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
27e80 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
27e90 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
27ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
27eb0 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
27ec0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
27ed0 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
27ee0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
27ef0 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
27f00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27f10 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
27f20 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
27f30 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
27f40 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
27f50 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
27f60 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
27f70 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
27f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
27f90 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
27fa0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
27fb0 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
27fc0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
27fd0 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
27fe0 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
27ff0 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
28000 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
28010 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
28020 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
28030 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
28040 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
28050 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
28060 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
28070 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
28080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
28090 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
280a0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
280b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
280c0 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
280d0 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
280e0 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
280f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
28100 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28110 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
28120 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
28130 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
28140 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
28150 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
28160 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
28170 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
28180 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
28190 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
281a0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
281b0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
281c0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
281d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
281e0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
281f0 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
28200 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
28210 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
28220 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
28230 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
28240 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
28250 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
28260 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
28270 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
28280 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
28290 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
282a0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
282b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
282c0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
282d0 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
282e0 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
282f0 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
28300 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
28310 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
28320 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
28330 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
28340 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
28350 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
28360 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
28370 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
28380 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
28390 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
283a0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
283b0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
283c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
283d0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
283e0 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
283f0 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
28400 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
28410 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
28420 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
28430 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
28440 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
28450 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28460 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
28470 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
28480 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28490 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
284a0 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
284b0 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
284c0 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
284d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
284e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
284f0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
28500 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
28510 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28520 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28530 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
28540 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
28550 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
28560 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
28570 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
28580 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
28590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
285a0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
285b0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
285c0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
285d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
285e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
285f0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
28600 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
28610 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
28620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28630 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28640 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
28650 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
28660 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
28670 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
28680 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
28690 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
286a0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
286b0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
286c0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
286d0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
286e0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
286f0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
28700 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
28710 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
28720 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
28730 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
28740 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28750 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
28760 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
28770 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
28780 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
28790 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
287a0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
287b0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
287c0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
287d0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
287e0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
287f0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
28800 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
28810 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
28820 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
28830 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
28840 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
28850 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
28860 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
28870 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
28880 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
28890 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
288a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
288b0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
288c0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
288d0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
288e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
288f0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
28900 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
28910 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28920 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
28930 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
28940 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
28950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28960 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
28970 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
28980 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
28990 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
289a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
289b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
289c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
289d0 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
289e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
289f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
28a00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28a10 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
28a20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28a30 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
28a40 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
28a50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28a60 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
28a70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28a80 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28a90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28aa0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
28ab0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
28ac0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
28ad0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28ae0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28af0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28b00 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28b10 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28b20 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28b30 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
28b40 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
28b50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28b60 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
28b70 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
28b80 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
28b90 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
28ba0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
28bb0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
28bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28bf0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28c00 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28c20 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
28c30 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28c40 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
28c50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
28c60 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
28c70 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
28c80 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
28c90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28ca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28cb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28cd0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
28ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28d10 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
28d20 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
28d30 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
28d40 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
28d50 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
28d60 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
28d70 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
28d80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28d90 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
28da0 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
28db0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28dc0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
28dd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
28de0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
28df0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
28e00 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
28e10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28e20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
28e50 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
28e60 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
28e70 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
28e80 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
28e90 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
28ea0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
28eb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
28ec0 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
28ed0 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
28ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
28ef0 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
28f00 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
28f10 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
28f20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
28f30 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
28f40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
28f60 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
28f70 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
28f80 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
28f90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
28fa0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28fb0 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
28fc0 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
28fd0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
28fe0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
28ff0 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
29000 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
29010 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
29020 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
29030 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
29040 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29050 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
29060 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
29070 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29080 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
29090 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
290a0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
290b0 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
290c0 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
290d0 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
290e0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
290f0 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
29100 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
29110 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
29120 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
29130 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
29140 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
29150 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
29160 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
29170 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
29180 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
29190 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
291a0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
291b0 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
291c0 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
291d0 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
291e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
291f0 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
29200 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
29210 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
29220 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
29230 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
29240 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
29250 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
29260 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
29270 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
29280 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
29290 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
292a0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
292b0 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
292c0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
292d0 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
292e0 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
292f0 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
29300 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
29310 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
29320 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
29330 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
29340 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
29350 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
29360 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
29370 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
29380 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29390 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
293a0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
293b0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
293c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
293d0 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
293e0 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
293f0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
29400 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
29410 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29420 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
29430 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
29440 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
29450 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
29460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29480 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29490 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
294a0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
294b0 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
294c0 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
294d0 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
294e0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
294f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29510 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29520 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29540 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
29550 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
29560 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
29570 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
29580 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
29590 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
295a0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
295b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
295c0 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
295d0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
295e0 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
295f0 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
29600 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
29610 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
29620 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
29630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
29640 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
29660 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29670 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29680 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
29690 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
296a0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
296b0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
296c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
296d0 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
296e0 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
296f0 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
29700 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
29710 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
29720 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
29740 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
29750 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
29760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
29770 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
29780 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
29790 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
297a0 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
297b0 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
297c0 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
297d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
297e0 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
297f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
29800 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
29810 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29820 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
29830 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
29840 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
29850 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
29860 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
29870 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29880 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29890 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
298a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
298b0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
298c0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
298d0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
298e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
298f0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
29900 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
29910 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
29920 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
29930 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
29940 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
29950 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
29960 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
29970 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
29980 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
29990 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
299a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
299b0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
299c0 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
299d0 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
299e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
299f0 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
29a00 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
29a10 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
29a20 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29a30 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
29a40 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
29a50 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
29a60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29a70 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
29a80 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
29a90 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
29aa0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
29ab0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
29ac0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
29ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
29ae0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29af0 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
29b00 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b30 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
29b40 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
29b50 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
29b60 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29b70 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
29b80 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
29b90 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
29ba0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
29bb0 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
29bc0 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
29bd0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
29be0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
29bf0 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
29c00 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
29c10 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
29c20 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
29c30 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
29c40 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
29c50 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29c60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
29c70 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
29c80 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
29c90 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
29ca0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
29cb0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
29cc0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
29cd0 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
29ce0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
29cf0 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
29d00 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
29d10 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
29d20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
29d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29d40 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
29d50 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
29d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
29d70 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
29d80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
29d90 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
29da0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
29db0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
29dc0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
29dd0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
29de0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
29df0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
29e00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
29e10 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
29e20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29e30 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
29e40 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
29e50 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
29e60 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
29e70 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
29e80 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
29e90 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
29ea0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
29eb0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
29ec0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
29ed0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
29ee0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29ef0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
29f00 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29f30 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
29f40 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
29f50 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
29f60 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
29f70 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
29f80 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
29f90 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
29fa0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
29fb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29fc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
29fd0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
29fe0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29ff0 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2a000 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2a010 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2a020 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2a030 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2a040 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2a060 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2a070 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2a080 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2a090 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2a0a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2a0b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2a0c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a0d0 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2a0e0 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2a0f0 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2a100 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2a110 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2a120 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2a130 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2a140 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2a150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a160 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2a170 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a180 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a190 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2a1a0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a1b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
2a1c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2a1d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a1e0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2a1f0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2a200 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
2a210 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
2a220 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
2a230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a240 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2a250 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2a260 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
2a270 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2a280 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a2a0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2a2b0 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2a2c0 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2a2d0 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2a2e0 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2a2f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2a300 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2a310 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2a320 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2a330 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2a340 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2a350 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2a360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2a370 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2a380 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2a390 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a3a0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2a3b0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2a3c0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2a3d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a3e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2a3f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2a400 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2a410 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2a420 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2a430 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2a440 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2a450 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2a460 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2a470 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a480 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a490 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2a4a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a4b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2a4c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2a4d0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2a4e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2a4f0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2a500 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2a510 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a520 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2a530 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2a540 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a550 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2a560 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2a570 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2a580 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a590 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2a5a0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2a5b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2a5c0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2a5d0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2a5e0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2a5f0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2a600 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2a610 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2a620 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2a630 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2a640 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2a650 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2a660 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2a670 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2a680 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2a690 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2a6a0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2a6b0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2a6c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2a6d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a6e0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2a6f0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2a700 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2a710 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2a720 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2a730 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2a740 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
2a750 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2a760 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2a770 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2a780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
2a790 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
2a7a0 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2a7b0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2a7c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a7d0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2a7e0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2a7f0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2a800 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2a810 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2a820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a850 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2a860 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2a870 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a880 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2a890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2a8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a8b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2a8c0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2a8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2a8e0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2a8f0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2a900 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2a910 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2a920 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a930 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2a940 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2a950 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2a960 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2a970 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2a980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2a990 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2a9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2a9b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a9c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a9d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a9e0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2a9f0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2aa00 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2aa10 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2aa20 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2aa30 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2aa40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2aa50 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2aa60 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2aa70 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2aa80 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2aa90 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2aaa0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2aab0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2aac0 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2aad0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2aae0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2aaf0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2ab00 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2ab10 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2ab20 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2ab30 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2ab40 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2ab50 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2ab60 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2ab70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2ab80 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2ab90 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2aba0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2abb0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2abc0 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2abd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2abe0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2abf0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2ac00 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2ac10 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2ac20 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2ac30 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ac40 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2ac50 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2ac60 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2ac70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2ac80 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2ac90 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2aca0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2acb0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2acc0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2acd0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2ace0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2acf0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2ad00 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2ad10 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2ad20 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2ad30 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2ad40 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2ad50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2ad60 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2ad70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2ad80 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2ad90 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2ada0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2adb0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2adc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2add0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2ade0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2adf0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2ae00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ae10 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2ae20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2ae30 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2ae40 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ae50 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2ae60 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ae70 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ae80 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2ae90 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2aea0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2aeb0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2aec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2aed0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2aee0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2aef0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2af00 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2af10 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2af20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2af30 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2af40 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2af50 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2af60 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2af70 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2af80 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2af90 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2afa0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2afb0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2afc0 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2afd0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2afe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2aff0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2b000 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2b010 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2b020 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2b030 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2b040 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2b050 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2b060 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2b070 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2b080 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2b090 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2b0a0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2b0b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2b0c0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2b0d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2b0e0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2b0f0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2b100 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2b110 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2b120 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2b130 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2b140 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2b150 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2b160 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2b170 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2b180 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2b190 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2b1a0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b1b0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2b1d0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b1e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b1f0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b200 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b210 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b220 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2b230 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2b240 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b250 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b260 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2b270 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b280 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2b290 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b2a0 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2b2b0 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2b2c0 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2b2d0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2b2e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2b2f0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2b300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b310 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2b320 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2b330 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b340 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2b350 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2b360 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2b370 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2b380 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2b390 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2b3a0 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2b3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b3c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2b3d0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2b3e0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2b3f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2b400 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2b410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2b420 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b430 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2b440 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2b450 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2b460 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2b470 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2b480 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2b490 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b4a0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2b4b0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2b4c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b4d0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2b4e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b4f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b510 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2b520 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2b530 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2b540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2b550 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2b560 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2b570 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2b580 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2b590 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2b5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b5b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b5c0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2b5d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2b5e0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2b5f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2b600 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2b610 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2b620 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2b630 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2b640 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2b650 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2b660 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2b670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b680 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2b690 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2b6a0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2b6b0 43 6f 64 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Code;.  if( !MEM
2b6c0 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  DB ){.    PgHdr 
2b6d0 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
2b6e0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2b6f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2b700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
2b710 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2b720 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2b730 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2b740 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b  E_OK && pList ){
2b750 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4e  .      PgHdr *pN
2b760 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
2b770 72 74 79 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rty;.      if( p
2b780 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  List->nRef==0 ){
2b790 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2b7a0 67 65 72 53 74 72 65 73 73 28 28 76 6f 69 64 2a  gerStress((void*
2b7b0 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b  )pPager, pList);
2b7c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2b7d0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
2b7e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
2b7f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
2b800 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
2b810 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
2b820 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
2b830 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
2b840 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
2b850 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
2b860 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
2b870 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
2b880 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
2b890 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
2b8a0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
2b8b0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
2b8c0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2b8d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2b8e0 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2b8f0 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2b900 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2b910 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2b920 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2b930 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2b940 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2b950 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2b960 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2b970 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2b980 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2b990 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2b9a0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2b9b0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2b9c0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2b9d0 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2b9e0 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2b9f0 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2ba00 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2ba10 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2ba20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2ba30 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2ba40 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2ba50 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2ba60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2ba70 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2ba80 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2ba90 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2baa0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2bab0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2bac0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2bad0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2bae0 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2baf0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
2bb00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
2bb10 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
2bb20 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
2bb30 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
2bb40 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
2bb50 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
2bb60 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
2bb70 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
2bb80 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
2bb90 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  * flags..**.** T
2bba0 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
2bbb0 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
2bbc0 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
2bbd0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2bbe0 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
2bbf0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
2bc00 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
2bc10 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
2bc20 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
2bc30 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
2bc40 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
2bc50 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2bc60 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
2bc70 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
2bc80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2bc90 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
2bca0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
2bcb0 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
2bcc0 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
2bcd0 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
2bce0 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
2bcf0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
2bd00 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
2bd10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2bd20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2bd30 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
2bd40 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
2bd50 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
2bd60 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
2bd70 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
2bd80 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
2bd90 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
2bda0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2bdb0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2bdc0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
2bdd0 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
2bde0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
2bdf0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
2be00 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
2be10 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
2be20 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2be30 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2be40 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2be50 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
2be60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2be70 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2be80 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
2be90 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2bea0 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
2beb0 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2bec0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
2bed0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2bee0 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
2bef0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
2bf00 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
2bf10 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2bf20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
2bf30 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
2bf40 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
2bf50 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2bf60 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
2bf70 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
2bf80 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
2bf90 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
2bfa0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2bfb0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
2bfc0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
2bfd0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
2bfe0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
2bff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2c000 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2c010 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
2c020 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
2c030 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
2c040 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
2c050 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
2c060 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
2c070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2c080 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2c090 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
2c0a0 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
2c0b0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
2c0c0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c0d0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
2c0e0 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
2c0f0 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
2c100 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2c110 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
2c120 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
2c130 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
2c140 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
2c150 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
2c160 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
2c170 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2c180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c190 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
2c1a0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
2c1b0 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
2c1c0 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
2c1d0 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
2c1e0 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
2c1f0 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  al */.  int pcac
2c200 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
2c210 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
2c220 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2c230 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
2c240 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
2c250 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2c260 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2c270 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
2c280 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63  page size */.  c
2c290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20  onst char *zUri 
2c2a0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61  = 0;    /* URI a
2c2b0 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  rgs to copy */. 
2c2c0 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20   int nUri = 0;  
2c2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c2e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2c2f0 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72  URI args at *zUr
2c300 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  i */..  /* Figur
2c310 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
2c320 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
2c330 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2c340 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
2c350 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
2c360 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
2c370 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
2c380 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
2c390 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
2c3a0 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
2c3b0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
2c3c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
2c3d0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
2c3e0 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
2c3f0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
2c400 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
2c410 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
2c420 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
2c430 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
2c440 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
2c450 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
2c460 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
2c470 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
2c480 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
2c490 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
2c4a0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2c4b0 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
2c4c0 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
2c4d0 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
2c4e0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
2c4f0 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
2c500 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2c510 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
2c520 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2c530 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
2c540 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
2c550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
2c560 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2c570 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
2c580 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
2c590 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2c5a0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2c5b0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2c5c0 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2c5d0 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2c5e0 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2c5f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2c600 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2c610 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2c620 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2c630 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2c640 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2c650 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2c660 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2c670 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2c680 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2c690 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2c6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c6b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74  OMEM;.      nPat
2c6c0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c6d0 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c6e0 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2c6f0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2c700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c710 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2c720 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2c730 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2c740 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2c750 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2c760 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2c770 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2c780 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2c790 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2c7a0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2c7b0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2c7c0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2c7d0 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2c7e0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2c7f0 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2c800 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2c810 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2c820 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2c830 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c840 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2c850 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2c860 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2c870 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2c880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c890 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  EM;.    }.    zP
2c8a0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2c8b0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2c8c0 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2c8d0 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2c8e0 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2c8f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2c900 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2c910 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2c920 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2c930 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2c940 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c950 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2c960 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2c970 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2c980 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2c990 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2c9a0 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2c9b0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c9c0 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2c9d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2c9e0 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2c9f0 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2ca00 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2ca10 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2ca20 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2ca30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2ca40 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2ca50 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2ca60 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2ca70 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2ca80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2ca90 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2caa0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2cab0 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2cac0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2cad0 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2cae0 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2caf0 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2cb00 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2cb10 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2cb20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2cb30 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2cb40 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2cb50 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2cb60 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2cb70 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2cb80 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2cb90 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2cba0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2cbb0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2cbc0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2cbd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2cbf0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2cc00 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2cc10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2cc20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2cc30 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2cc40 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2cc50 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2cc60 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2cc70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2cc80 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2cc90 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2cca0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2ccb0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2ccc0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2ccd0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2cce0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2ccf0 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2cd10 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2cd20 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2cd30 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2cd50 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2cd60 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2cd70 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2cd80 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2cd90 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2cda0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2cdb0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2cdc0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2cdd0 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2cde0 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2cdf0 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2ce00 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2ce10 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2ce20 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2ce30 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2ce40 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2ce50 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2ce60 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2ce70 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2ce80 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2ce90 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2cea0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2ceb0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2cec0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2ced0 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2cee0 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2cef0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2cf00 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2cf10 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2cf20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2cf30 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2cf40 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2cf50 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2cf60 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2cf70 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2cf80 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2cf90 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2cfa0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2cfb0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2cfc0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2cfd0 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2cfe0 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2cff0 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d010 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2d020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2d030 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2d040 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2d050 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2d060 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2d070 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2d080 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2d090 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2d0a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d0b0 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2d0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2d0d0 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d0e0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2d0f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2d100 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2d110 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2d120 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2d130 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2d140 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2d150 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2d160 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2d170 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2d180 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2d190 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2d1a0 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2d1b0 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2d1c0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2d1d0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2d1e0 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2d1f0 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2d200 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2d210 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2d220 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2d230 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2d240 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2d250 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d260 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2d270 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2d280 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2d290 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2d2a0 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2d2b0 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2d2c0 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2d2d0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2d2e0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2d2f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2d300 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2d310 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2d320 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2d330 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2d340 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2d350 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d360 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2d370 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d380 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2d390 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2d3a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2d3b0 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2d3c0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d3d0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2d3e0 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2d3f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2d400 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d410 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2d420 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2d430 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2d440 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d450 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d460 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2d470 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2d480 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2d490 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2d4a0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2d4b0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2d4c0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2d4d0 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2d4e0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d4f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d500 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2d510 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2d520 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2d530 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2d540 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2d550 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2d560 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2d570 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2d580 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2d590 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2d5a0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2d5b0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2d5c0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2d5d0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2d5e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2d5f0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2d600 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2d610 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d630 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2d640 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2d650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d660 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2d670 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d680 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2d690 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2d6a0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2d6b0 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2d6c0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2d6d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2d6e0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2d6f0 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2d700 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2d710 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2d720 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2d730 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2d740 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2d750 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2d760 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2d770 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2d780 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d790 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2d7a0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2d7b0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2d7c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2d7d0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2d7e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2d7f0 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2d800 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2d810 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2d820 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2d830 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2d840 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2d850 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2d860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d870 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
2d880 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2d890 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2d8a0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  ->fd);.      if(
2d8b0 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20   !readOnly ){.  
2d8c0 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
2d8d0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
2d8e0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2d8f0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d900 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2d910 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d920 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ZE);.        if(
2d930 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
2d940 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
2d950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d960 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2d970 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2d980 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2d990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2d9a0 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2d9b0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d9c0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2d9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d9e0 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d9f0 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  t = (u32)pPager-
2da00 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
2da10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2da30 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2da40 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
2da50 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
2da60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2da70 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2da80 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2da90 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2daa0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2dab0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
2dac0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
2dad0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2dae0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2daf0 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
2db00 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2db10 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69  ii=szPageDflt; i
2db20 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  i<=SQLITE_MAX_DE
2db30 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2db40 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20   ii=ii*2){.     
2db50 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
2db60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2db70 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
2db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
2db90 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2dba0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2dbb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dbc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
2dbd0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
2dbe0 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33  noLock = sqlite3
2dbf0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2dc00 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22  lename, "nolock"
2dc10 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2dc20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f  (iDc & SQLITE_IO
2dc30 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d  CAP_IMMUTABLE)!=
2dc40 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
2dc50 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2dc60 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75  zFilename, "immu
2dc70 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20  table", 0) ){.  
2dc80 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73          vfsFlags
2dc90 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
2dca0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
2dcb0 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b      goto act_lik
2dcc0 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20  e_temp_file;.   
2dcd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
2dce0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
2dcf0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
2dd00 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
2dd10 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
2dd20 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2dd30 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
2dd40 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
2dd50 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
2dd60 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
2dd70 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
2dd80 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
2dd90 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
2dda0 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
2ddb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2ddc0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
2ddd0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
2dde0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
2ddf0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
2de00 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
2de10 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
2de20 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
2de30 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
2de40 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
2de50 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
2de60 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
2de70 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  urnal..    **.  
2de80 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2de90 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66   also runs for f
2dea0 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69  iles marked as i
2deb0 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  mmutable..    */
2dec0 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f   .act_like_temp_
2ded0 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69  file:.    tempFi
2dee0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
2def0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2df00 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f  ER_READER;     /
2df10 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72  * Pretend we alr
2df20 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b  eady have a lock
2df30 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2df40 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56  eLock = EXCLUSIV
2df50 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72  E_LOCK;    /* Pr
2df60 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20  etend we are in 
2df70 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a  EXCLUSIVE mode *
2df80 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  /.    pPager->no
2df90 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20  Lock = 1;       
2dfa0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
2dfb0 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20  o locking */.   
2dfc0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2dfd0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2dfe0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2dff0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2e000 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2e010 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2e020 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2e030 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2e040 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2e050 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2e060 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2e070 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2e080 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2e0a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2e0b0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2e0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2e0d0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2e0e0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2e0f0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2e100 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e110 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
2e120 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
2e130 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69  e object. */.  i
2e140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e150 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2e160 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20  nExtra<1000 );. 
2e170 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
2e180 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
2e190 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
2e1a0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2e1b0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2e1c0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2e1d0 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
2e1e0 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
2e1f0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
2e200 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2e220 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2e230 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
2e240 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72    Pager structur
2e250 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
2e260 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2e270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e280 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
2e290 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
2e2a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
2e2b0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
2e2c0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71  mpSpace);.    sq
2e2d0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2e2e0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2e2f0 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  c;.  }..  PAGERT
2e300 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25  RACE(("OPEN %d %
2e310 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
2e320 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
2e330 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e340 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  e));.  IOTRACE((
2e350 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
2e360 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2e370 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70  zFilename))..  p
2e380 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2e390 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e  l = (u8)useJourn
2e3a0 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  al;.  /* pPager-
2e3b0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
2e3c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e3d0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
2e3e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
2e3f0 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ef = 0; */.  /* 
2e400 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
2e410 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e420 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
2e430 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e440 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
2e450 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
2e460 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
2e470 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
2e480 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
2e490 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
2e4a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e4b0 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2e4c0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2e4d0 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2e4e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2e4f0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e500 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2e510 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2e520 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2e530 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2e540 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2e550 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2e560 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2e570 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2e580 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2e590 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2e5a0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2e5b0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2e5c0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2e5d0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2e5e0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2e5f0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2e600 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2e610 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2e620 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2e630 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2e640 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2e650 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28  >tempFile;.  if(
2e660 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2e670 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2e680 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d  Pager->fullSync=
2e690 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2e6a0 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ( pPager->syncFl
2e6b0 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2e6c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61  sert( pPager->wa
2e6d0 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b  lSyncFlags==0 );
2e6e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2e6f0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2e700 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65  gs==0 );.  }else
2e710 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  {.    pPager->fu
2e720 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  llSync = 1;.    
2e730 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e740 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2e750 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67  NORMAL;.    pPag
2e760 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2e770 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e780 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43  ORMAL | WAL_SYNC
2e790 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
2e7a0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
2e7b0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
2e7c0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
2e7d0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2e7e0 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
2e7f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
2e800 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
2e810 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
2e820 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
2e830 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28  ager->nExtra = (
2e840 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50  u16)nExtra;.  pP
2e850 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
2e860 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
2e870 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
2e880 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
2e890 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2e8a0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70  ger->fd) || temp
2e8b0 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63  File );.  setSec
2e8c0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2e8d0 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e  .  if( !useJourn
2e8e0 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  al ){.    pPager
2e8f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2e900 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e910 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69  E_OFF;.  }else i
2e920 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
2e930 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2e940 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
2e950 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
2e960 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
2e970 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
2e980 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e990 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
2e9a0 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
2e9b0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
2e9c0 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d   xReinit;.  /* m
2e9d0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
2e9e0 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
2e9f0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
2ea00 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ea10 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  szMmap = SQLITE_
2ea20 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a  DEFAULT_MMAP_SIZ
2ea30 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74  E // will be set
2ea40 20 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a   by btree.c */..
2ea50 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
2ea60 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ger;.  return SQ
2ea70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20  LITE_OK;.}.../* 
2ea80 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
2ea90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
2eaa0 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64  s not be deleted
2eab0 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20   or renamed out 
2eac0 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68  from.** under th
2ead0 65 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  e pager.  Return
2eae0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2eaf0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
2eb00 69 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68  ill were it ough
2eb10 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69  t.** to be on di
2eb20 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d  sk.  Return non-
2eb30 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41  zero (SQLITE_REA
2eb40 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72  DONLY_DBMOVED or
2eb50 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
2eb60 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73  r.** code from s
2eb70 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2eb80 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  ) if the databas
2eb90 65 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69  e has gone missi
2eba0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
2ebb0 74 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  t databaseIsUnmo
2ebc0 76 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  ved(Pager *pPage
2ebd0 72 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f  r){.  int bHasMo
2ebe0 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ved = 0;.  int r
2ebf0 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
2ec00 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74  ->tempFile ) ret
2ec10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2ec20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2ec30 69 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ize==0 ) return 
2ec40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
2ec50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69  ert( pPager->zFi
2ec60 6c 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72  lename && pPager
2ec70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ->zFilename[0] )
2ec80 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2ec90 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
2eca0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
2ecb0 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44  _FCNTL_HAS_MOVED
2ecc0 2c 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20  , &bHasMoved);. 
2ecd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ece0 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  NOTFOUND ){.    
2ecf0 2f 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f  /* If the HAS_MO
2ed00 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  VED file-control
2ed10 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65   is unimplemente
2ed20 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  d, assume that t
2ed30 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68  he file.    ** h
2ed40 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65  as not been move
2ed50 64 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20  d.  That is the 
2ed60 68 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76  historical behav
2ed70 69 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70  ior of SQLite: p
2ed80 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76  rior to.    ** v
2ed90 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74  ersion 3.8.3, it
2eda0 20 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a   never checked *
2edb0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
2edc0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
2edd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ede0 26 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a  && bHasMoved ){.
2edf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2ee00 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2ee10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ee20 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
2ee30 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2ee40 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
2ee50 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
2ee60 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
2ee70 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
2ee80 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
2ee90 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2eea0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
2eeb0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
2eec0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
2eed0 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
2eee0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
2eef0 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
2ef00 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
2ef10 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
2ef20 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
2ef30 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
2ef40 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
2ef50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2ef60 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
2ef70 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
2ef80 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2ef90 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
2efa0 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
2efb0 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
2efc0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2efd0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
2efe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2eff0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2f000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
2f010 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
2f020 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
2f030 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
2f040 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
2f050 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2f060 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
2f070 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
2f080 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
2f090 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2f0a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
2f0b0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
2f0c0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
2f0d0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
2f0e0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
2f0f0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
2f100 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
2f110 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
2f120 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
2f130 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2f140 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
2f150 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
2f160 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
2f170 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
2f180 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2f190 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
2f1a0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
2f1b0 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
2f1c0 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
2f1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
2f1e0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
2f1f0 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
2f200 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
2f210 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
2f220 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
2f230 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
2f240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2f250 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2f260 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
2f270 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
2f280 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
2f290 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
2f2a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2f2b0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
2f2c0 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
2f2d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f2e0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2f2f0 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
2f300 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
2f310 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
2f320 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2f330 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
2f340 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
2f350 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
2f360 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f370 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
2f380 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2f390 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
2f3a0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
2f3b0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
2f3c0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2f3d0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2f3e0 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
2f3f0 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
2f400 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
2f410 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2f420 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
2f430 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
2f440 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
2f450 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
2f460 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
2f470 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
2f480 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2f490 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
2f4a0 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
2f4b0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2f4c0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2f4d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2f4e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2f4f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f500 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  */.  int exists 
2f510 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
2f520 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2f530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f540 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
2f550 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73   jrnlOpen = !!is
2f560 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f570 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
2f580 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2f5a0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2f5b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2f5c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2f5d0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61  GER_OPEN );..  a
2f5e0 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d  ssert( jrnlOpen=
2f5f0 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f  =0 || ( sqlite3O
2f600 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2f610 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a  istics(pPager->j
2f620 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45  fd) &.    SQLITE
2f630 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
2f640 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29  LE_WHEN_OPEN.  )
2f650 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
2f660 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f   0;.  if( !jrnlO
2f670 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
2f680 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f690 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2f6a0 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
2f6b0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
2f6c0 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66  xists);.  }.  if
2f6d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f6e0 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  && exists ){.   
2f6f0 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b   int locked = 0;
2f700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f710 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f  True if some pro
2f720 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2f730 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20  ERVED lock */.. 
2f740 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69     /* Race condi
2f750 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74  tion here:  Anot
2f760 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
2f770 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64  t have been hold
2f780 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  ing the.    ** t
2f790 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
2f7a0 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72   and have a jour
2f7b0 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20  nal open at the 
2f7c0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
2f7d0 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61  ) .    ** call a
2f7e0 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64  bove, but then d
2f7f0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2f800 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c  l and drop the l
2f810 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a  ock before.    *
2f820 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20  * we get to the 
2f830 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
2f840 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2f850 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66  Lock() call.  If
2f860 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
2f870 74 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72  the case, this r
2f880 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69  outine might thi
2f890 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  nk there is a ho
2f8a0 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20  t journal when. 
2f8b0 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68     ** in fact th
2f8c0 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68  ere is none.  Th
2f8d0 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  is results in a 
2f8e0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
2f8f0 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  hich will.    **
2f900 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62   be dealt with b
2f910 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72  y the playback r
2f920 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20  outine.  Ticket 
2f930 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20  #3883..    */.  
2f940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f950 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2f960 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
2f970 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20  ocked);.    if( 
2f980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f990 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
2f9a0 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f9c0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2f9d0 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
2f9e0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  e */..      rc =
2f9f0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
2fa00 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
2fa10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2fa20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fa30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
2fa40 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70  tabase is zero p
2fa50 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ages in size, th
2fa60 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69  at means that ei
2fa70 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20  ther (1) the.   
2fa80 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2fa90 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f  is a remnant fro
2faa0 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61  m a prior databa
2fab0 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2fac0 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20   name where.    
2fad0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2fae0 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74  ase file but not
2faf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
2fb00 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29   deleted, or (2)
2fb10 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20   the initial.   
2fb20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
2fb30 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74  ion that populat
2fb40 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  es a new databas
2fb50 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  e is being rolle
2fb60 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  d back..        
2fb70 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
2fb80 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
2fb90 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74  ile can be delet
2fba0 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61  ed.  However, ta
2fbb0 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20  ke care.        
2fbc0 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65  ** not to delete
2fbd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fbe0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
2fbf0 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20  dy open due to. 
2fc00 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
2fc10 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a  l_mode=PERSIST..
2fc20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2fc30 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
2fc40 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  && !jrnlOpen ){.
2fc50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2fc60 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
2fc70 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oc();.          
2fc80 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  if( pagerLockDb(
2fc90 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
2fca0 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f  _LOCK)==SQLITE_O
2fcb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2fcc0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
2fcd0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2fce0 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
2fcf0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2fd00 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2fd10 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63  ode ) pagerUnloc
2fd20 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
2fd30 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2fd40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2fd50 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
2fd60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
2fd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fd80 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
2fd90 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2fda0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
2fdb0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
2fdc0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
2fdd0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
2fde0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2fdf0 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
2fe00 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
2fe10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
2fe20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
2fe30 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
2fe40 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
2fe50 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
2fe60 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
2fe70 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
2fe80 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
2fe90 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
2fea0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
2feb0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
2fec0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
2fed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
2fee0 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2fef0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
2ff00 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
2ff10 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2ff20 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2ff30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2ff40 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2ff50 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2ff60 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2ff70 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2ff80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ffa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2ffb0 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2ffc0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2ffd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2ffe0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2fff0 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
30000 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30010 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30020 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
30030 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
30040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
30050 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
30060 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30070 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
30080 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
30090 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
300a0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
300b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
300c0 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
300d0 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
300e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
300f0 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
30100 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
30110 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
30120 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
30130 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
30140 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
30150 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
30160 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f 20  * it has a zero 
30170 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
30180 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
30190 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
301a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
301b0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
301c0 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
301d0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
301e0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
301f0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
30200 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
30210 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
30220 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
30230 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
30240 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
30250 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
30260 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
30270 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
30280 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
30290 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
302a0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
302b0 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
302c0 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
302d0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
302e0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
302f0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
30300 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
30310 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
30320 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
30330 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
30340 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
30350 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
30360 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
30370 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30380 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
30390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
303a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
303b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
303c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
303d0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
303e0 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
303f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30400 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
30410 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
30420 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
30430 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
30440 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30450 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30460 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30470 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30480 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30490 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
304a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
304b0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
304c0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
304d0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
304e0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
304f0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
30500 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30510 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30520 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30530 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30540 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30550 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30560 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30570 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30580 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30590 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
305a0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
305b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
305c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
305d0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
305e0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
305f0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30600 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30610 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30620 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30630 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30640 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30650 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30660 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30670 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30680 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30690 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
306a0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
306b0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
306c0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
306d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
306e0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
306f0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30700 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
30710 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
30720 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
30730 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
30740 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
30750 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
30760 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
30770 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
30780 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
30790 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
307a0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
307b0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
307c0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
307d0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
307e0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
307f0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
30800 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
30810 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
30820 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
30830 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
30840 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
30850 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
30860 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30870 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
30880 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
30890 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
308a0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
308b0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
308c0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
308d0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
308e0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
308f0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
30900 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
30910 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
30920 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
30930 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
30940 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
30950 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
30960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30980 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
30990 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
309a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
309b0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
309c0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
309d0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
309e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
309f0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
30a00 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
30a10 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
30a20 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
30a30 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
30a40 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
30a50 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
30a60 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
30a70 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
30a80 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   mode..  */.  as
30a90 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
30aa0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
30ab0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
30ac0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
30ad0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
30ae0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
30af0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30b00 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30b10 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
30b20 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
30b30 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d  );.  if( NEVER(M
30b40 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
30b50 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75  errCode) ){ retu
30b60 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
30b70 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61  de; }..  if( !pa
30b80 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
30b90 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  ) && pPager->eSt
30ba0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30bb0 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a  ){.    int bHotJ
30bc0 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20  ournal = 1;     
30bd0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30be0 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68  there exists a h
30bf0 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ot journal-file 
30c00 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
30c10 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72  !MEMDB );..    r
30c20 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
30c30 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
30c40 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
30c50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30c60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
30c70 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
30c80 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50  k==NO_LOCK || pP
30c90 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
30ca0 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
30cb0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
30cc0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30cd0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
30ce0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
30cf0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
30d00 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
30d10 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
30d20 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
30d30 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
30d40 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
30d50 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
30d60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
30d70 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
30d80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61  ){.      rc = ha
30d90 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
30da0 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c  er, &bHotJournal
30db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30dd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  {.      goto fai
30de0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
30df0 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  f( bHotJournal )
30e00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
30e10 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
30e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30e30 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
30e40 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67  LBACK;.        g
30e50 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
30e60 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65    }..      /* Ge
30e70 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
30e80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30e90 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
30ea0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
30eb0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
30ec0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
30ed0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
30ee0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
30ef0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
30f00 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
30f10 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
30f20 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
30f30 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
30f40 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
30f50 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
30f60 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
30f70 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
30f80 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
30f90 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
30fa0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
30fb0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
30fc0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
30fd0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
30fe0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
30ff0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
31000 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
31010 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
31020 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
31030 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
31040 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
31050 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
31060 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
31070 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
31080 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
31090 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
310a0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
310b0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
310c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
310d0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
310e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
310f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31100 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
31110 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
31120 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
31130 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
31140 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
31150 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
31160 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
31170 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
31180 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31190 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
311a0 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
311b0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
311c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
311d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
311e0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
311f0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
31200 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
31210 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
31220 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
31230 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
31240 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
31250 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
31260 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
31270 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
31280 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
31290 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
312a0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
312b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
312c0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
312d0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
312e0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
312f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
31300 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
31310 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
31320 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
31330 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
31340 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
31350 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
31360 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
31370 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
31380 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
31390 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
313a0 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
313b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
313c0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
313d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
313e0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
313f0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
31400 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
31410 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
31420 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
31430 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
31440 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
31450 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
31460 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
31470 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
31480 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
31490 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
314a0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
314b0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
314c0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
314d0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
314e0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
314f0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
31500 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
31510 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
31520 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31530 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
31540 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
31550 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
31560 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
31570 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
31580 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
31590 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
315a0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
315b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
315c0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
315d0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
315e0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
315f0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
31600 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
31610 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31620 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
31630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
31640 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
31650 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31660 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
31670 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
31680 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
31690 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
316a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
316b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
316c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
316d0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
316e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
316f0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
31700 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
31710 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
31720 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
31730 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
31740 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
31750 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
31760 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
31770 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
31780 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31790 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
317a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
317b0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
317c0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
317d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
317e0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
317f0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
31800 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
31810 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
31820 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
31830 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
31840 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
31850 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
31860 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
31870 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
31880 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
31890 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
318a0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
318b0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
318c0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
318d0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
318e0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
318f0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
31900 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
31910 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
31920 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
31930 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
31940 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
31950 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
31960 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
31970 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
31980 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
31990 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
319a0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
319b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
319c0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
319d0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
319e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
319f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
31a00 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
31a10 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
31a20 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
31a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31a40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31a50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
31a60 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
31a70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
31a80 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
31a90 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
31aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
31ab0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31ac0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
31ad0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
31ae0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
31af0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
31b00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31b10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
31b20 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
31b30 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
31b40 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
31b50 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
31b60 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
31b70 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
31b80 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
31b90 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
31ba0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
31bb0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
31bc0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
31bd0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
31be0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
31bf0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
31c00 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
31c10 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
31c20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
31c30 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
31c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
31c50 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
31c60 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
31c70 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
31c80 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
31c90 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
31ca0 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
31cb0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
31cc0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31cd0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
31ce0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
31cf0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
31d00 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
31d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
31d20 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
31d30 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
31d40 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
31d50 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
31d60 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
31d70 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
31d80 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
31d90 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
31da0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
31db0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
31dc0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
31dd0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31de0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
31df0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
31e00 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
31e10 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
31e20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
31e30 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
31e40 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
31e50 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
31e60 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
31e70 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
31e80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
31e90 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
31ea0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
31eb0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
31ec0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
31ed0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
31ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31ef0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
31f00 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
31f10 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
31f20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
31f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31f40 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31f50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31f60 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
31f70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
31f80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
31f90 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
31fa0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
31fb0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
31fc0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
31fd0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
31fe0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70  r->tempFile && p
31ff0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
32000 61 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  aredLock ){.    
32010 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
32020 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
32030 65 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e  en acquired then
32040 20 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20   check to.      
32050 2a 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61  ** see if the da
32060 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
32070 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68  modified.  If th
32080 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63  e database has c
32090 68 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a  hanged,.      **
320a0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
320b0 2e 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68  .  The hasHeldSh
320c0 61 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72  aredLock flag pr
320d0 65 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d  events this from
320e0 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
320f0 69 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20  ing on the very 
32100 66 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20  first access to 
32110 61 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72  a file, in order
32120 20 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20   to save a.     
32130 20 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63   ** single unnec
32140 65 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73  essary sqlite3Os
32150 52 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74  Read() call at t
32160 68 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20  he start-up..   
32170 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44     **.      ** D
32180 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
32190 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
321a0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
321b0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
321c0 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
321d0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
321e0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
321f0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
32200 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
32210 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
32220 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
32230 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
32240 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
32250 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
32260 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
32270 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
32280 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
32290 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
322a0 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
322b0 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
322c0 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
322d0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
322e0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
322f0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
32300 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
32310 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
32320 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
32330 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
32340 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
32350 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
32360 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
32370 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  no nPage = 0;.  
32380 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
32390 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
323a0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
323b0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ..      rc = pag
323c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
323d0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
323e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
323f0 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20   failed;..      
32400 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
32410 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
32420 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
32430 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
32440 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
32450 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32460 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
32470 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
32480 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32490 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
324a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
324b0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
324c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
324d0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
324e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
324f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
32510 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
32520 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
32530 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
32540 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
32550 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
32560 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
32570 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
32580 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
32590 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
325a0 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
325b0 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65      /* Unmap the
325c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
325d0 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
325e0 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f  hat external pro
325f0 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a  cesses.        *
32600 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63  * may have trunc
32610 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73  ated the databas
32620 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20  e file and then 
32630 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b  extended it back
32640 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69  .        ** to i
32650 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
32660 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
32670 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64  ess was not hold
32680 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20  ing a lock..    
32690 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
326a0 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78  ase there may ex
326b0 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70  ist a Pager.pMap
326c0 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70   mapping that ap
326d0 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a  pears.        **
326e0 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74   to be the right
326f0 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74   size but is not
32700 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e   actually valid.
32710 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20   Avoid this.    
32720 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69      ** possibili
32730 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20  ty by unmapping 
32740 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a  the db here. */.
32750 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46          if( USEF
32760 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a  ETCH(pPager) ){.
32770 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32780 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
32790 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
327a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
327b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
327c0 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20   there is a WAL 
327d0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
327e0 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68  -system, open th
327f0 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57  is database in W
32800 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  AL.    ** mode. 
32810 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66  Otherwise, the f
32820 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
32830 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  n call is a no-o
32840 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
32850 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49   = pagerOpenWalI
32860 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29  fPresent(pPager)
32870 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32880 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73  _OMIT_WAL.    as
32890 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
328a0 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  al==0 || rc==SQL
328b0 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66  ITE_OK );.#endif
328c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
328d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
328e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
328f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
32900 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65      rc = pagerBe
32910 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
32920 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
32930 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
32940 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
32950 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  N && rc==SQLITE_
32960 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
32970 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
32980 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64  ager, &pPager->d
32990 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61  bSize);.  }.. fa
329a0 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
329b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
329c0 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
329d0 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  );.    pager_unl
329e0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
329f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32a00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
32a10 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  PEN );.  }else{.
32a20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32a30 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
32a40 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68  R;.    pPager->h
32a50 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32a60 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
32a70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
32a80 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
32a90 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
32aa0 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63  ed zero, rollbac
32ab0 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20  k any active.** 
32ac0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
32ad0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
32ae0 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20  ..**.** Except, 
32af0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
32b00 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74  EXCLUSIVE when t
32b10 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
32b20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c  to in.** the rol
32b30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74  lback journal, t
32b40 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74  he unlock is not
32b50 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74   performed and t
32b60 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69  here is.** nothi
32b70 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  ng to rollback, 
32b80 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
32b90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
32ba0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
32bb0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32bc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32bd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d    if( pPager->nM
32be0 6d 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71  mapOut==0 && (sq
32bf0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
32c00 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
32c10 63 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  che)==0) ){.    
32c20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
32c30 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
32c40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71    }.}../*.** Acq
32c50 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65  uire a reference
32c60 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
32c70 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50  pgno in pager pP
32c80 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20  ager (a page.** 
32c90 72 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79  reference has ty
32ca0 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20  pe DbPage*). If 
32cb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
32cc0 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73  ference is .** s
32cd0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61  uccessfully obta
32ce0 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69  ined, it is copi
32cf0 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e  ed to *ppPage an
32d00 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
32d10 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
32d20 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
32d30 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
32d40 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73  the cache, it is
32d50 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
32d60 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20  therwise, a new 
32d70 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61  page object is a
32d80 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70  llocated and pop
32d90 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61  ulated with data
32da0 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68  .** read from th
32db0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
32dc0 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20   In some cases, 
32dd0 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
32de0 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20  e may.** choose 
32df0 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  not to allocate 
32e00 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
32e10 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20  t and may reuse 
32e20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f  an existing.** o
32e30 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75  bject with no ou
32e40 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
32e50 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nces..**.** The 
32e60 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
32e70 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
32e80 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
32e90 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65  zed to zeros the
32ea0 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20   .** first time 
32eb0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
32ec0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66   into memory. If
32ed0 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73   the page reques
32ee0 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61  ted is .** alrea
32ef0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  dy in the cache 
32f00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
32f10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  on is called, th
32f20 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20  en the extra.** 
32f30 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20  data is left as 
32f40 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  it was when the 
32f50 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20  page object was 
32f60 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  last used..**.**
32f70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
32f80 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65   image is smalle
32f90 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
32fa0 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20  sted page or if 
32fb0 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76  a .** non-zero v
32fc0 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61  alue is passed a
32fd0 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  s the noContent 
32fe0 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68  parameter and th
32ff0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
33000 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
33010 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ady stored in th
33020 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f  e cache, then no
33030 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b   .** actual disk
33040 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e   read occurs. In
33050 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d   this case the m
33060 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74  emory image of t
33070 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69  he .** page is i
33080 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c  nitialized to al
33090 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20  l zeros. .**.** 
330a0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
330b0 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
330c0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
330d0 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  re about the con
330e0 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20  tents.** of the 
330f0 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
33100 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
33110 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
33120 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
33130 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
33140 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
33150 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
33160 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
33170 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
33180 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
33190 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
331a0 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
331b0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
331c0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
331d0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
331e0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
331f0 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
33200 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
33210 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
33220 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
33230 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
33240 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
33250 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
33260 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
33270 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
33280 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
33290 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
332a0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
332b0 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
332c0 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
332d0 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
332e0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
332f0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
33300 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
33310 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
33320 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
33330 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
33340 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
33350 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
33360 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
33370 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
33380 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
33390 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
333a0 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
333b0 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
333c0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
333d0 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
333e0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
333f0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
33400 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
33410 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
33420 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
33430 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
33440 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
33450 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
33460 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
33470 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
33480 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
33490 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
334a0 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
334b0 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
334c0 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
334d0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
334e0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
334f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
33500 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
33510 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
33520 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
33530 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
33540 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
33550 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
33560 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
33570 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
33580 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
33590 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
335a0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
335b0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
335c0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
335d0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
335e0 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
335f0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
33600 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
33610 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
33620 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
33630 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
33640 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
33650 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
33660 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33670 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
33680 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
33690 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
336a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
336b0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
336c0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
336d0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
336e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
336f0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
33700 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
33710 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
33720 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
33730 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33740 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
33750 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
33760 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
33770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
33780 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
33790 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
337a0 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
337b0 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
337c0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
337d0 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
337e0 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
337f0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
33800 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
33810 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
33820 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
33830 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
33840 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
33850 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
33860 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
33870 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
33880 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
33890 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
338a0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
338b0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
338c0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
338d0 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
338e0 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
338f0 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43  gno>1 && USEFETC
33900 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20  H(pPager).   && 
33910 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
33920 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
33930 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
33940 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23  GET_READONLY)).#
33950 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
33960 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61  _CODEC.   && pPa
33970 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23  ger->xCodec==0.#
33980 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a  endif.  );..  /*
33990 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
339a0 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
339b0 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
339c0 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
339d0 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
339e0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
339f0 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
33a00 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
33a10 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
33a20 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
33a30 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
33a40 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
33a50 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
33a60 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
33a70 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
33a80 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
33a90 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
33aa0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
33ab0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33ac0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
33ad0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
33ae0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
33af0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
33b00 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
33b10 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
33b20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e  assert( noConten
33b30 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d  t==0 || bMmapOk=
33b40 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  =0 );..  assert(
33b50 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
33b60 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
33b70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
33b80 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
33b90 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
33ba0 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
33bb0 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
33bc0 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
33bd0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
33be0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
33bf0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
33c00 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
33c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
33c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33c30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
33c40 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61  f( bMmapOk && pa
33c50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33c60 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
33c70 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
33c80 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
33c90 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
33ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
33cc0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
33cd0 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
33ce0 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
33cf0 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rame==0 ){.     
33d00 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30   void *pData = 0
33d10 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
33d20 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
33d30 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
33d40 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31      (i64)(pgno-1
33d50 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
33d60 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61  Size, pPager->pa
33d70 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20  geSize, &pData. 
33d80 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
33d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33da0 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20   && pData ){.   
33db0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
33dc0 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
33dd0 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  ADER ){.        
33de0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
33df0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
33e00 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  r, pgno);.      
33e10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
33e20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
33e30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63      rc = pagerAc
33e40 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61  quireMapPage(pPa
33e50 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61  ger, pgno, pData
33e60 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20  , &pPg);.       
33e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33e80 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
33e90 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
33ea0 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61  i64)(pgno-1)*pPa
33eb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
33ec0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d  Data);.        }
33ed0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
33ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
33ef0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33f00 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _OK );.         
33f10 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
33f20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33f30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
33f40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33f50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33f70 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33f80 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
33f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20  .    }..    {.  
33fa0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63      sqlite3_pcac
33fb0 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a  he_page *pBase;.
33fc0 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71        pBase = sq
33fd0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33fe0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
33ff0 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  , pgno, 3);.    
34000 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34010 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
34020 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34030 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e  hStress(pPager->
34040 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26  pPCache, pgno, &
34050 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20  pBase);.        
34060 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34070 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61  K ) goto pager_a
34080 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34090 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
340a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
340b0 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  g = *ppPage = 0;
340c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
340d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
340e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
340f0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34100 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34110 7d 0a 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70  }.      pPg = *p
34120 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
34130 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
34140 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
34150 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a  , pgno, pBase);.
34160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34170 67 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  g!=0 );.    }.  
34180 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
34190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
341a0 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
341b0 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
341c0 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
341d0 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
341e0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
341f0 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
34200 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
34210 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
34220 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
34230 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
34240 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
34250 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
34260 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
34270 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
34280 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34290 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
342a0 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b  Pg==(*ppPage) );
342b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
342c0 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  pgno==pgno );.  
342d0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
342e0 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70  ger==pPager || p
342f0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b  Pg->pPager==0 );
34300 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61  ..  if( pPg->pPa
34310 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e  ger && !noConten
34320 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
34330 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61  his case the pca
34340 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74  che already cont
34350 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69  ains an initiali
34360 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20  zed copy of.    
34370 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74  ** the page. Ret
34380 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74  urn without furt
34390 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20  her ado.  */.   
343a0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50   assert( pgno<=P
343b0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26  AGER_MAX_PGNO &&
343c0 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f   pgno!=PAGER_MJ_
343d0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
343e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
343f0 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54  t[PAGER_STAT_HIT
34400 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]++;.    return 
34410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
34420 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
34430 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
34440 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
34450 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
34460 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
34470 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
34480 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70    */..    pPg->p
34490 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
344a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
344b0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
344c0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
344d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
344e0 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
344f0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
34500 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
34510 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
34520 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
34530 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
34540 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
34550 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
34560 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34570 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34580 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34590 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
345a0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
345b0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
345c0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
345d0 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
345e0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
345f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
34600 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
34610 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
34620 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
34630 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
34640 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34650 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34670 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
34680 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
34690 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
346a0 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
346b0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
346c0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
346d0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
346e0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
346f0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
34700 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
34710 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
34720 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
34730 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
34740 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
34750 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
34760 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
34770 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
34780 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
34790 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
347a0 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
347b0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
347c0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
347d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
347e0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
347f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
34800 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
34810 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
34820 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
34830 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
34840 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
34850 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34860 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
34870 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
34880 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
34890 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
348a0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
348b0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
348c0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
348d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
348e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
348f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
34900 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
34910 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
34920 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
34930 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
34940 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
34950 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
34960 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
34970 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
34980 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
34990 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
349a0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
349b0 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
349c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
349d0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
349e0 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
349f0 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
34a00 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
34a10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34a20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34a30 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
34a40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
34a50 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
34a60 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
34a70 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
34a80 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
34a90 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
34aa0 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
34ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34ad0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34ae0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
34b00 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
34b10 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
34b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34b30 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
34b40 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
34b50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
34b60 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
34b70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
34b80 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
34b90 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
34ba0 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
34bb0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
34bc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
34bd0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
34be0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
34bf0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
34c00 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
34c10 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
34c20 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
34c30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
34c40 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
34c50 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
34c60 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
34c70 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
34c80 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
34c90 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
34ca0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
34cb0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
34cc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34cd0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
34ce0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
34cf0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
34d00 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
34d10 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34d20 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
34d30 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34d40 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
34d50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34d60 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
34d70 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
34d80 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
34d90 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
34da0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
34db0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
34dc0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
34dd0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
34de0 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
34df0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34e00 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
34e10 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
34e20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34e30 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
34e40 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
34e50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
34e60 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34e70 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
34e80 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
34e90 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
34ea0 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
34eb0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
34ec0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
34ed0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
34ee0 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
34ef0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
34f00 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
34f10 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
34f20 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
34f30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
34f40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
34f50 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
34f60 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
34f70 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
34f80 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
34f90 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
34fa0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
34fb0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
34fc0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
34fd0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
34fe0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34ff0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
35000 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
35010 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
35020 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
35030 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
35040 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
35050 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
35060 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
35070 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
35080 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
35090 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
350a0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
350b0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
350c0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
350d0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
350e0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
350f0 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
35100 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
35110 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
35120 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
35130 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
35140 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
35150 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
35160 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
35170 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
35180 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
35190 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
351a0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
351b0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
351c0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
351d0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
351e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
351f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
35200 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
35210 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
35220 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
35230 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
35240 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
35250 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
35260 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
35270 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
35280 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
35290 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
352a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
352b0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
352c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
352d0 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
352e0 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
352f0 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
35300 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
35310 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
35320 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
35330 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
35340 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
35350 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
35360 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
35370 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
35380 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
35390 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
353a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
353b0 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
353c0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
353d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
353e0 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
353f0 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
35400 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
35410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35420 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
35430 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
35440 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
35450 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
35460 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
35470 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
35480 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
35490 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
354a0 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
354b0 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
354c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
354d0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
354e0 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
354f0 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
35500 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
35510 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
35520 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
35530 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
35540 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
35550 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
35560 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
35570 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
35580 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
35590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355a0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
355b0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
355c0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
355d0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
355e0 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
355f0 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
35600 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
35610 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35620 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35630 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
35640 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
35650 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
35660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
35670 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
35680 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
35690 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
356a0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
356b0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
356c0 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
356d0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
356e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
356f0 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
35700 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
35710 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
35720 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
35730 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
35740 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
35750 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
35760 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
35770 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
35780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
35790 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
357a0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
357b0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
357c0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
357d0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
357e0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
357f0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35800 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
35810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
35820 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  OMEM;.    }.  . 
35830 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
35840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
35850 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
35860 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   open. */.    if
35870 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
35880 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
35890 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
358a0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
358b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
358c0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  Y ){.        sql
358d0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
358e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
358f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
35900 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
35910 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20  flags =         
35920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
35930 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a   flags to open j
35940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
35950 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35960 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
35970 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
35980 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
35990 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
359a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
359b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
359c0 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
359d0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
359e0 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
359f0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
35a00 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
35a10 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
35a20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
35a30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
35a40 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
35a50 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
35a60 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
35a70 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
35a80 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
35a90 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
35aa0 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
35ab0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
35ac0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35ad0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35ae0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
35af0 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
35b00 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
35b10 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
35b20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
35b30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35b40 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
35b50 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
35b60 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
35b70 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
35b80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35b90 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
35ba0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35bb0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35bc0 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
35bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35be0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35bf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
35c00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35c10 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
35c20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
35c30 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
35c40 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
35c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
35c60 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
35c70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
35c80 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
35c90 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
35ca0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35cb0 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
35cc0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
35cd0 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
35ce0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
35cf0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
35d00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35d10 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
35d20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
35d30 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
35d40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35d50 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
35d60 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
35d70 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
35d80 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35da0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35db0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35dc0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
35dd0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35de0 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
35df0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35e00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35e10 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35e20 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
35e30 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35e40 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
35e50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
35e70 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
35e80 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
35e90 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
35ea0 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
35eb0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35ec0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
35ed0 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
35ee0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35ef0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
35f00 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
35f10 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
35f20 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
35f30 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
35f40 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35f50 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
35f60 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
35f70 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
35f80 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
35f90 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
35fa0 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
35fb0 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
35fc0 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
35fd0 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
35fe0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
35ff0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
36000 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
36010 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
36020 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
36030 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
36040 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
36050 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
36060 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
36070 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
36080 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
36090 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
360a0 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
360b0 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
360c0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
360d0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
360e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
360f0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
36100 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
36110 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
36120 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36130 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
36140 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
36150 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
36160 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
36170 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
36180 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36190 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
361a0 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
361b0 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
361c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
361d0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
361e0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
361f0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
36200 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
36210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
36220 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
36230 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
36240 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
36250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36260 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36270 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
36280 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
36290 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
362a0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
362b0 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
362c0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
362d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
362e0 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
362f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36300 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
36310 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
36320 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36330 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
36340 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
36350 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36360 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
36370 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
36380 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
36390 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
363a0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
363b0 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
363c0 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
363d0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
363e0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
363f0 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
36400 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36410 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
36420 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36430 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
36440 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
36450 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36470 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
36480 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
364a0 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
364b0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
364c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
364d0 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
364e0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
364f0 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
36500 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
36510 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
36520 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
36530 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
36540 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
36550 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
36560 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
36570 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
36580 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
36590 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
365a0 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
365b0 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
365c0 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
365d0 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
365e0 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
365f0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
36600 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
36610 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
36620 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
36630 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
36640 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
36650 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
36660 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36670 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
36680 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
36690 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
366a0 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
366b0 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
366c0 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
366d0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
366e0 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
366f0 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
36700 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
36710 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
36720 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
36730 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
36740 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
36750 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
36760 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36770 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
36780 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
36790 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
367a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
367b0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
367c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
367d0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
367e0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
367f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36800 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
36810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36820 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
36830 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
36840 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
36850 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
36860 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
36870 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
36880 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
36890 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
368a0 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
368b0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
368c0 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
368d0 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
368e0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
368f0 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
36900 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
36910 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
36920 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
36930 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
36940 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
36950 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36960 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
36970 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
36980 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
36990 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
369a0 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
369b0 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
369c0 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
369d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
369e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
369f0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
36a00 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
36a10 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
36a20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
36a30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
36a40 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
36a50 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36a60 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
36a70 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36a80 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36a90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36aa0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
36ab0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36ac0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36ad0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36ae0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
36af0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
36b00 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36b10 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36b20 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
36b30 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36b40 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36b50 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
36b60 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
36b70 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
36b80 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
36b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36ba0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67  ./*.** Write pag
36bb0 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65  e pPg onto the e
36bc0 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  nd of the rollba
36bd0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  ck journal..*/.s
36be0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
36bf0 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41  NLINE int pagerA
36c00 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
36c10 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
36c20 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36c30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36c40 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
36c50 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61  u32 cksum;.  cha
36c60 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34  r *pData2;.  i64
36c70 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
36c80 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
36c90 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
36ca0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
36cb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
36cc0 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63  page that.  ** c
36cd0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
36ce0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
36cf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36d00 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20  t verifies.  ** 
36d10 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
36d20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
36d30 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
36d40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
36d50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
36d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
36d70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36d80 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70  ff );.  CODEC2(p
36d90 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
36da0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
36db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36dc0 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
36dd0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
36de0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
36df0 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a  *)pData2);..  /*
36e00 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
36e10 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
36e20 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
36e30 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
36e40 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
36e50 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
36e60 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
36e70 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
36e80 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
36e90 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
36ea0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
36eb0 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
36ec0 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b  in.  ** playback
36ed0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
36ee0 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
36ef0 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
36f00 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69   restored.  ** i
36f10 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36f20 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
36f30 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
36f40 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
36f50 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
36f60 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
36f70 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
36f80 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
36f90 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72  SYNC;..  rc = wr
36fa0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
36fb0 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
36fc0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72  ->pgno);.  if( r
36fd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
36ff0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
37000 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
37010 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
37020 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
37030 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37040 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
37050 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
37060 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
37070 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
37080 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
37090 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
370a0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
370b0 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22  c;..  IOTRACE(("
370c0 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
370d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
370e0 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
370f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
37100 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
37110 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
37120 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
37130 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
37140 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54  count);.  PAGERT
37150 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
37160 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37170 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
37180 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45  \n",.       PAGE
37190 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
371a0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
371b0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
371c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
371d0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
371e0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50  sh(pPg)));..  pP
371f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37200 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
37210 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
37220 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73  er->nRec++;.  as
37230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
37240 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
37250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
37260 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
37270 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
37280 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
37290 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
372a0 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MEM );.  assert(
372b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
372c0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
372d0 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64  EM );.  rc |= ad
372e0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
372f0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
37300 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74  >pgno);.  assert
37310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37320 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
37330 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
37340 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
37350 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
37360 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
37370 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
37380 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
37390 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
373a0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
373b0 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
373c0 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
373d0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
373e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
373f0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
37400 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
37410 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
37420 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
37430 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
37440 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
37450 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
37460 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
37470 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
37480 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
37490 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
374a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
374b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
374c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
374d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
374e0 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
374f0 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
37500 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
37510 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
37520 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
37530 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
37540 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37550 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
37560 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
37570 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
37580 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
37590 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
375a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
375b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
375c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
375d0 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
375e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
375f0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37600 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
37610 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37620 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37630 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
37640 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37650 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
37660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37670 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20  >errCode==0 );. 
37680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37690 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
376a0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
376b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
376c0 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
376d0 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
376e0 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
376f0 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
37700 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
37710 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
37720 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
37730 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
37740 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
37750 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37760 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
37770 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
37780 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
37790 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
377a0 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
377b0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
377c0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
377d0 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
377e0 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
377f0 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
37800 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
37810 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
37820 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
37830 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
37840 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
37850 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
37860 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
37870 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
37880 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
37890 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
378a0 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
378b0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
378c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
378d0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
378e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
378f0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
37900 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
37910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37920 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
37930 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37940 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
37950 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
37960 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37970 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37980 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
37990 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69   the page that i
379a0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f  s about to be mo
379b0 64 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e  dified as dirty.
379c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
379d0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
379e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f  );..  /* If a ro
379f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69  llback journal i
37a00 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d  s in use, them m
37a10 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67  ake sure the pag
37a20 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a  e that is about.
37a30 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69    ** to change i
37a40 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s in the rollbac
37a50 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  k journal, or if
37a60 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e   the page is a n
37a70 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a  ew page off.  **
37a80 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65   then end of the
37a90 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65   file, make sure
37aa0 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73   it is marked as
37ab0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37ac0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37ad0 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   (pPager->pInJou
37ae0 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70  rnal!=0) == isOp
37af0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
37b00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
37b10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20  >pInJournal!=0. 
37b20 20 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76    && sqlite3Bitv
37b30 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50  ecTestNotNull(pP
37b40 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
37b50 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a  , pPg->pgno)==0.
37b60 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
37b70 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37b80 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ger)==0 );.    i
37b90 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
37ba0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37bb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
37bc0 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c  agerAddPageToRol
37bd0 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67  lbackJournal(pPg
37be0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37c00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
37c20 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  se{.      if( pP
37c30 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37c40 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
37c60 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37c70 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
37c80 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52   }.      PAGERTR
37c90 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
37ca0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
37cb0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
37cc0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
37cd0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
37ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
37cf0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37d00 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37d10 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )));.    }.  }..
37d20 20 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44    /* The PGHDR_D
37d30 49 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20  IRTY bit is set 
37d40 61 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70  above when the p
37d50 61 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f  age was added to
37d60 20 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a   the dirty-list.
37d70 20 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20    ** and before 
37d80 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65  writing the page
37d90 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
37da0 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69  ck journal.  Wai
37db0 74 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a  t until now,.  *
37dc0 2a 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  * after the page
37dd0 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
37de0 73 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65  sfully journalle
37df0 64 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e  d, before settin
37e00 67 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44 52  g the.  ** PGHDR
37e10 5f 57 52 49 54 45 41 42 4c 45 20 62 69 74 20 74  _WRITEABLE bit t
37e20 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
37e30 61 74 20 74 68 65 20 70 61 67 65 20 63 61 6e 20  at the page can 
37e40 62 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 69  be safely modifi
37e50 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ed..  */.  pPg->
37e60 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 57  flags |= PGHDR_W
37e70 52 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f  RITEABLE;.  .  /
37e80 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
37e90 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
37ea0 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
37eb0 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
37ec0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
37ed0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
37ee0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
37ef0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
37f00 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
37f10 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  >0 ){.    rc = s
37f20 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
37f30 65 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20 20  equired(pPg);.  
37f40 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
37f50 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
37f60 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a   and return. */.
37f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
37f80 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
37f90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
37fa0 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
37fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
37fd0 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
37fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37ff0 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77  te() that runs w
38000 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  hen the sector s
38010 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  ize.** is larger
38020 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73   than the page s
38030 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b  ize.  SQLite mak
38040 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62  es the (reasonab
38050 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74  le) assumption t
38060 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73  hat.** all bytes
38070 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65   of a sector are
38080 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65   written togethe
38090 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20  r by hardware.  
380a0 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73  Hence, all bytes
380b0 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20   of.** a sector 
380c0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
380d0 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66  alled in case of
380e0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e   a power loss in
380f0 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
38100 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  * a write..**.**
38110 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65   Usually, the se
38120 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73  ctor size is les
38130 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
38140 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
38150 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61  , in which.** ca
38160 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  se pages can be 
38170 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69  individually wri
38180 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tten.  This rout
38190 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e  ine only runs in
381a0 20 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f   the.** exceptio
381b0 6e 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 74  nal case where t
381c0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
381d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
381e0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f   sector size..*/
381f0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
38200 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
38210 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f  rWriteLargeSecto
38220 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
38230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
38240 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
38250 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
38260 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
38270 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
38280 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
38290 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
382a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
382b0 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
382c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
382d0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
382e0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
382f0 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69  cated on. */.  i
38300 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  nt nPage = 0;   
38310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
38320 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
38330 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
38340 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  o journal */.  i
38350 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
38360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
38370 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
38380 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
38390 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
383a0 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
383b0 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
383c0 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72  _SYNC */.  Pager
383d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
383e0 70 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 70  pPager; /* The p
383f0 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70  ager that owns p
38400 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  Pg */.  Pgno nPa
38410 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
38420 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
38430 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
38440 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ze);..  /* Set t
38450 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
38460 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54  SYNC bit to 1. T
38470 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
38480 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
38490 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
384a0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
384b0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
384c0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
384d0 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  y.  ** this func
384e0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tion..  */.  ass
384f0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
38500 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
38510 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
38520 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29  PILLFLAG_NOSYNC)
38530 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==0 );.  pPager-
38540 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
38550 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b  PILLFLAG_NOSYNC;
38560 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63  ..  /* This tric
38570 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
38580 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
38590 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
385a0 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  e are.  ** an in
385b0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
385c0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
385d0 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
385e0 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66  entifier.  ** of
385f0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
38600 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
38610 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
38620 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28  .  */.  pg1 = ((
38630 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
38640 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
38650 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67  1)) + 1;..  nPag
38660 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
38670 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  >dbSize;.  if( p
38680 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
38690 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  unt ){.    nPage
386a0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
386b0 70 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20  pg1)+1;.  }e