/ Hex Artifact Content
Login

Artifact 3469df53e0d6acd4f40d77f1f414079e1c0b17e5ca2a782e7ccd91262a8ce67e:


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 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 23 69 66 64 65 66  47483647..#ifdef
9660: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
9670: 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 2f 2a 0a  VERFLOW_READ./*.
9680: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
9690: 66 20 70 61 67 65 20 70 67 6e 6f 20 63 61 6e 20  f page pgno can 
96a0: 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
96b0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
96c0: 73 65 20 66 69 6c 65 0a 2a 2a 20 62 79 20 74 68  se file.** by th
96d0: 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2e 20  e b-tree layer. 
96e0: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  This is the case
96f0: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   if:.**.**   * t
9700: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9710: 20 69 73 20 6f 70 65 6e 2c 0a 2a 2a 20 20 20 2a   is open,.**   *
9720: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
9730: 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
9740: 20 63 61 63 68 65 2c 20 61 6e 64 0a 2a 2a 20 20   cache, and.**  
9750: 20 2a 20 74 68 65 20 64 65 73 69 72 65 64 20 70   * the desired p
9760: 61 67 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65  age is not curre
9770: 6e 74 6c 79 20 69 6e 20 74 68 65 20 77 61 6c 20  ntly in the wal 
9780: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
9790: 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74 52  ite3PagerDirectR
97a0: 65 61 64 4f 6b 28 50 61 67 65 72 20 2a 70 50 61  eadOk(Pager *pPa
97b0: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
97c0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
97d0: 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  d->pMethods==0 )
97e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
97f0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 49 73   sqlite3PCacheIs
9800: 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50  Dirty(pPager->pP
9810: 43 61 63 68 65 29 20 29 20 72 65 74 75 72 6e 20  Cache) ) return 
9820: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
9830: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
9840: 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 21   pPager->xCodec!
9850: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  =0 ) return 0;.#
9860: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
9870: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
9880: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
9890: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 52 65 61   ){.    u32 iRea
98a0: 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  d = 0;.    int r
98b0: 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
98c0: 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28  te3WalFindFrame(
98d0: 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67  pPager->pWal, pg
98e0: 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a 20 20 20  no, &iRead);.   
98f0: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
9900: 49 54 45 5f 4f 4b 20 26 26 20 69 52 65 61 64 3d  ITE_OK && iRead=
9910: 3d 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  =0);.  }.#endif.
9920: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
9930: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
9940: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20  LITE_OMIT_WAL.# 
9950: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9960: 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c  al(x) ((x)->pWal
9970: 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  !=0).#else.# def
9980: 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28  ine pagerUseWal(
9990: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99a0: 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78  gerRollbackWal(x
99b0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
99c0: 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c  erWalFrames(v,w,
99d0: 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20  x,y) 0.# define 
99e0: 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
99f0: 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f  esent(z) SQLITE_
9a00: 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  OK.# define page
9a10: 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61  rBeginReadTransa
9a20: 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f  ction(z) SQLITE_
9a30: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  OK.#endif..#ifnd
9a40: 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ef NDEBUG ./*.**
9a50: 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   Usage:.**.**   
9a60: 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
9a70: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
9a80: 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73  r) );.**.** This
9a90: 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d   function runs m
9aa0: 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74  any asserts to t
9ab0: 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e  ry to find incon
9ac0: 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a  sistencies in.**
9ad0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
9ae0: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
9af0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
9b00: 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61  ic int assert_pa
9b10: 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20  ger_state(Pager 
9b20: 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  *p){.  Pager *pP
9b30: 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20  ager = p;..  /* 
9b40: 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61  State must be va
9b50: 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lid. */.  assert
9b60: 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ( p->eState==PAG
9b70: 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c  ER_OPEN.       |
9b80: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
9b90: 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20  ER_READER.      
9ba0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9bb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9bc0: 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  ED.       || p->
9bd0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9be0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
9bf0: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9c00: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9c10: 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  DBMOD.       || 
9c20: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9c30: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
9c40: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9c50: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
9c60: 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67  R.  );..  /* Reg
9c70: 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63  ardless of the c
9c80: 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20  urrent state, a 
9c90: 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63  temp-file connec
9ca0: 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61  tion always beha
9cb0: 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69  ves.  ** as if i
9cc0: 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69  t has an exclusi
9cd0: 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
9ce0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
9cf0: 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20   never updates. 
9d00: 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63   ** the change-c
9d10: 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f  ounter field, so
9d20: 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
9d30: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77  Done flag is alw
9d40: 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  ays set..  */.  
9d50: 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46  assert( p->tempF
9d60: 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f  ile==0 || p->eLo
9d70: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
9d80: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9d90: 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c  p->tempFile==0 |
9da0: 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  | pPager->change
9db0: 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20  CountDone );..  
9dc0: 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75  /* If the useJou
9dd0: 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65  rnal flag is cle
9de0: 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ar, the journal-
9df0: 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46  mode must be "OF
9e00: 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66  F". .  ** And if
9e10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9e20: 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20  e is "OFF", the 
9e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
9e40: 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t not be open.. 
9e50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9e60: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e70: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e80: 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75  OFF || p->useJou
9e90: 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
9ea0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9eb0: 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
9ec0: 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70  ODE_OFF || !isOp
9ed0: 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  en(p->jfd) );.. 
9ee0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d   /* Check that M
9ef0: 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53  EMDB implies noS
9f00: 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d  ync. And an in-m
9f10: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53  emory journal. S
9f20: 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20  ince .  ** this 
9f30: 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  means an in-memo
9f40: 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d  ry pager perform
9f50: 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20  s no IO at all, 
9f60: 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e  it cannot encoun
9f70: 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72  ter .  ** either
9f80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72   SQLITE_IOERR or
9f90: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72   SQLITE_FULL dur
9fa0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  ing rollback or 
9fb0: 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67  while finalizing
9fc0: 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c   .  ** a journal
9fd0: 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68   file. (although
9fe0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a   the in-memory j
9ff0: 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74  ournal implement
a000: 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20  ation may .  ** 
a010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
a020: 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20  ERR_NOMEM while 
a030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
a040: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
a050: 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20  n). It .  ** is 
a060: 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f  therefore not po
a070: 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e  ssible for an in
a080: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f  -memory pager to
a090: 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
a0a0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20   .  ** state..  
a0b0: 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  */.  if( MEMDB )
a0c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
a0d0: 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a  sOpen(p->fd) );.
a0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
a0f0: 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73  oSync );.    ass
a100: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
a110: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a120: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a130: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a140: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a150: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
a160: 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73   .    );.    ass
a170: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d  ert( p->eState!=
a180: 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
a190: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
a1a0: 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65  OPEN );.    asse
a1b0: 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
a1c0: 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  p)==0 );.  }..  
a1d0: 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e  /* If changeCoun
a1e0: 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20  tDone is set, a 
a1f0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72  RESERVED lock or
a200: 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
a210: 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68   held.  ** on th
a220: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  e file..  */.  a
a230: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
a240: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d  hangeCountDone==
a250: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
a260: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a270: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
a280: 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ->eLock!=PENDING
a290: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74  _LOCK );..  swit
a2a0: 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b  ch( p->eState ){
a2b0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
a2c0: 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65  OPEN:.      asse
a2d0: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
a2e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a2f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a300: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a310: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a320: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a330: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
a340: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  0 || pPager->tem
a350: 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62  pFile );.      b
a360: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a370: 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20  PAGER_READER:.  
a380: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a390: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a3a0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a3b0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a3c0: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
a3d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a3e0: 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  p->eLock>=SHARED
a3f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62  _LOCK );.      b
a400: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a410: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
a420: 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  KED:.      asser
a430: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a440: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a450: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a460: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a470: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a480: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a490: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a4a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a4b0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a4c0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
a4d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a4e0: 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67  er->dbSize==pPag
a4f0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
a500: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a510: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a520: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
a530: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
a540: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a550: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a560: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a570: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a580: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
a590: 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  r==0 );.      br
a5a0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a5b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a5c0: 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65  EMOD:.      asse
a5d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a5e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a5f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a600: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a610: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a620: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a630: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a640: 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73      /* It is pos
a650: 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f  sible that if jo
a660: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68  urnal_mode=wal h
a670: 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72  ere that neither
a680: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
a690: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72  journal file nor
a6a0: 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72   the WAL file ar
a6b0: 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70  e open. This hap
a6c0: 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20  pens during.    
a6d0: 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
a6e0: 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  k transaction th
a6f0: 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d  at switches from
a700: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66   journal_mode=of
a710: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  f.        ** to 
a720: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
a730: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
a740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a750: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a760: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
a770: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a780: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a790: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a7a0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a7b0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
a7d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a7e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a7f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
a800: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a810: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a820: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20 20  NALMODE_WAL2.   
a830: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
a840: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a850: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a860: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ==pPager->dbFile
a870: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a880: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a890: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a8a0: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a8b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a8c0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a8d0: 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20  TER_DBMOD:.     
a8e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a8f0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
a900: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a910: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
a920: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
a940: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
a950: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  er) );.      ass
a960: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45  ert( p->eLock>=E
a970: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a980: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a990: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20  sOpen(p->jfd) . 
a9a0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a9b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
a9d0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  FF .           |
a9e0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a9f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
aa00: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
aa10: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
aa20: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aa30: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20  RNALMODE_WAL2.  
aa40: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71 6c           || (sql
aa50: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
aa60: 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e 66  acteristics(p->f
aa70: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
aa80: 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20  BATCH_ATOMIC).  
aa90: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
aaa0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
aab0: 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d  rigSize<=pPager-
aac0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
aad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
aae0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
aaf0: 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20 20  ER_FINISHED:.   
ab00: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
ab10: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
ab20: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
ab30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
ab40: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
ab50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ab60: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
ab70: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
ab80: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
ab90: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
aba0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
abb0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
abc0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
abd0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
abe0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
abf0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
ac00: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ac10: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac20: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac30: 5f 57 41 4c 32 0a 20 20 20 20 20 20 20 20 20 20  _WAL2.          
ac40: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
ac50: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
ac60: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
ac70: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
ac80: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
aca0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
acb0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
acc0: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
acd0: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ace0: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
acf0: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ad00: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ad10: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ad20: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
ad30: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
ad40: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
ad50: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
ad60: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ad70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
ad80: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ada0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
adb0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
adc0: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
add0: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ade0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
adf0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ae00: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ae10: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ae20: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae30: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
ae40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
ae50: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
ae60: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ae70: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
ae80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae90: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
aea0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
aeb0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
aec0: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
aed0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
aee0: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
aef0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
af00: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
af10: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
af20: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
af30: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
af40: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
af50: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
af60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
af70: 6e 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20  ne has external 
af80: 6c 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72  linkage in order
af90: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
afa0: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a  piler warnings.*
afb0: 2a 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65  * about an unuse
afc0: 64 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  d function.  It 
afd0: 69 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68  is enclosed with
afe0: 69 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  in SQLITE_DEBUG 
aff0: 61 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e  and so does.** n
b000: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
b010: 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63  mal builds..*/.c
b020: 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72  har *print_pager
b030: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
b040: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
b050: 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73  zRet[1024];..  s
b060: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b070: 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20  1024, zRet,.    
b080: 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20    "Filename:    
b090: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53    %s\n".      "S
b0a0: 74 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73  tate:         %s
b0b0: 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20   errCode=%d\n". 
b0c0: 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20       "Lock:     
b0d0: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
b0e0: 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20   "Locking mode: 
b0f0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73   locking_mode=%s
b100: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b110: 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61  al mode:  journa
b120: 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  l_mode=%s\n".   
b130: 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72     "Backing stor
b140: 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d  e: tempFile=%d m
b150: 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e  emDb=%d useJourn
b160: 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22  al=%d\n".      "
b170: 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a  Journal:       j
b180: 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a  ournalOff=%lld j
b190: 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e  ournalHdr=%lld\n
b1a0: 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20  ".      "Size:  
b1b0: 20 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25          dbsize=%
b1c0: 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20  d dbOrigSize=%d 
b1d0: 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22  dbFileSize=%d\n"
b1e0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c  .      , p->zFil
b1f0: 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d  ename.      , p-
b200: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
b210: 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f  PEN            ?
b220: 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20   "OPEN" :.      
b230: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
b240: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
b250: 20 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a     ? "READER" :.
b260: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
b270: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
b280: 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54  LOCKED   ? "WRIT
b290: 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20  ER_LOCKED" :.   
b2a0: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
b2b0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
b2c0: 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f  HEMOD ? "WRITER_
b2d0: 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20  CACHEMOD" :.    
b2e0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b2f0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
b300: 44 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44  D    ? "WRITER_D
b310: 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  BMOD" :.        
b320: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b330: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
b340: 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53   ? "WRITER_FINIS
b350: 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  HED" :.        p
b360: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b370: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
b380: 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72  ? "ERROR" : "?er
b390: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b3a0: 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20  nt)p->errCode.  
b3b0: 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d      , p->eLock==
b3c0: 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  NO_LOCK         
b3d0: 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20  ? "NO_LOCK" :.  
b3e0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b3f0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
b400: 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20  ? "RESERVED" :. 
b410: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b420: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
b430: 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a   ? "EXCLUSIVE" :
b440: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b450: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  k==SHARED_LOCK  
b460: 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a     ? "SHARED" :.
b470: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b480: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20  ==UNKNOWN_LOCK  
b490: 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20    ? "UNKNOWN" : 
b4a0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b4b0: 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  , p->exclusiveMo
b4c0: 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22  de ? "exclusive"
b4d0: 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20   : "normal".    
b4e0: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f    , p->journalMo
b4f0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b500: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f  LMODE_MEMORY   ?
b510: 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20   "memory" :.    
b520: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b530: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b540: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f  LMODE_OFF      ?
b550: 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20   "off" :.       
b560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b580: 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64  DE_DELETE   ? "d
b590: 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20  elete" :.       
b5a0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b5b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b5c0: 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70  DE_PERSIST  ? "p
b5d0: 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20  ersist" :.      
b5e0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b5f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b600: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22  ODE_TRUNCATE ? "
b610: 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20  truncate" :.    
b620: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b630: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b640: 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f  LMODE_WAL      ?
b650: 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72   "wal" : "?error
b660: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
b670: 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e  p->tempFile, (in
b680: 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74  t)p->memDb, (int
b690: 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  )p->useJournal. 
b6a0: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
b6b0: 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  lOff, p->journal
b6c0: 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  Hdr.      , (int
b6d0: 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74  )p->dbSize, (int
b6e0: 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20  )p->dbOrigSize, 
b6f0: 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69  (int)p->dbFileSi
b700: 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  ze.  );..  retur
b710: 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
b720: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
b730: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76  erences to the v
b740: 61 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74  arious page gett
b750: 65 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ers */.static in
b760: 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
b770: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b780: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69  ge**,int);.stati
b790: 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72  c int getPageErr
b7a0: 6f 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  or(Pager*,Pgno,D
b7b0: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69  bPage**,int);.#i
b7c0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
b7d0: 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
b7e0: 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28  int getPageMMap(
b7f0: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b800: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69  ge**,int);.#endi
b810: 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
b820: 20 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68   Pager.xGet meth
b830: 6f 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f  od for the appro
b840: 70 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75  priate routine u
b850: 73 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20  sed to fetch.** 
b860: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
b870: 20 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   pager..*/.stati
b880: 63 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72  c void setGetter
b890: 4d 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50  Method(Pager *pP
b8a0: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
b8b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b8c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b8d0: 20 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b   = getPageError;
b8e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b8f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65  MMAP_SIZE>0.  }e
b900: 6c 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48  lse if( USEFETCH
b910: 28 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20  (pPager).#ifdef 
b920: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
b930: 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78  .   && pPager->x
b940: 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a  Codec==0.#endif.
b950: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
b960: 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d  >xGet = getPageM
b970: 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  Map;.#endif /* S
b980: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
b990: 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65  IZE>0 */.  }else
b9a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47  {.    pPager->xG
b9b0: 65 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d  et = getPageNorm
b9c0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
b9d0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b9e0: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
b9f0: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
ba00: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
ba10: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
ba20: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
ba30: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
ba40: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
ba50: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
ba60: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
ba70: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
ba80: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ba90: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
baa0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
bab0: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
bac0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
bad0: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
bae0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
baf0: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
bb00: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
bb10: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
bb20: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
bb30: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
bb40: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
bb50: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
bb60: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
bb70: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
bb80: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
bb90: 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   *p;.  Pgno pgno
bba0: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
bbb0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
bbc0: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
bbd0: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
bbe0: 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61    p = &pPager->a
bbf0: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
bc00: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
bc10: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
bc20: 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
bc30: 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  ull(p->pInSavepo
bc40: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
bc50: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bc60: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc70: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
bc80: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
bc90: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
bca0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
bcb0: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
bcc0: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
bcd0: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
bce0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
bcf0: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
bd00: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bd10: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
bd20: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
bd30: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65  pPg->pgno);.}.#e
bd40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
bd50: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
bd60: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
bd70: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bd80: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
bd90: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
bda0: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
bdb0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bdc0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
bdd0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
bde0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
bdf0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
be00: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
be10: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
be20: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
be30: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
be40: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
be50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
be60: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
be70: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
be80: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
be90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
bea0: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
beb0: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
bec0: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
bed0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bee0: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
bef0: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
bf00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bf10: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
bf20: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
bf30: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
bf40: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
bf50: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
bf60: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
bf70: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
bf80: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
bf90: 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ,B).../*.** Writ
bfa0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
bfb0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
bfc0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
bfd0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
bfe0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
bff0: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
c000: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
c010: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
c020: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
c030: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
c040: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
c050: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
c060: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
c070: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
c080: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
c090: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
c0a0: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
c0b0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
c0c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c0d0: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
c0e0: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
c0f0: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a  ither NO_LOCK.**
c100: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
c110: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
c120: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c130: 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  e call to xUnloc
c140: 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c  k().** succeeds,
c150: 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
c160: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
c170: 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65   match the (atte
c180: 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e  mpted) new lock.
c190: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c1a0: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c1b0: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c1c0: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c1d0: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
c1e0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
c1f0: 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20  ify it. See the 
c200: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c210: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a  e #define of .**
c220: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c230: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c240: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c250: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c  tic int pagerUnl
c260: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
c270: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
c280: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c290: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
c2a0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c2b0: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
c2c0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b  er->eLock==eLock
c2d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
c2e0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
c2f0: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c300: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c310: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c320: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
c330: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
c340: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c350: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
c360: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
c370: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
c380: 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  rc = pPager->noL
c390: 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ock ? SQLITE_OK 
c3a0: 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  : sqlite3OsUnloc
c3b0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c3c0: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
c3d0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
c3e0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c3f0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c400: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c410: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
c420: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
c430: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
c440: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
c450: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c460: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c470: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
c480: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
c490: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
c4a0: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
c4b0: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
c4c0: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
c4d0: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
c4e0: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
c4f0: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
c500: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
c510: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
c520: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
c530: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
c540: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
c550: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
c560: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
c570: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
c580: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
c590: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
c5a0: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
c5b0: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
c5c0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
c5d0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
c5e0: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
c5f0: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
c600: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
c610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c620: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
c630: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
c640: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
c650: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
c660: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
c670: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
c680: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
c690: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
c6a0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
c6b0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
c6c0: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
c6d0: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
c6e0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
c6f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c700: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c710: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
c720: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
c730: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c740: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
c750: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c760: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
c770: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
c780: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
c790: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
c7a0: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
c7b0: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
c7c0: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
c7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c7e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c7f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
c800: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
c810: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
c820: 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20  mic-write or.** 
c830: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
c840: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  te optimizations
c850: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
c860: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
c870: 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74  e.** atomic-writ
c880: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c890: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
c8a0: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
c8b0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c8c0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c8d0: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
c8e0: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
c8f0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c900: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
c910: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
c920: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
c930: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c940: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
c950: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
c960: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
c970: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
c980: 2a 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  ** If it can be 
c990: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76  used, then the v
c9a0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c9b0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c9c0: 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
c9d0: 65 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69  e when it contai
c9e0: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c9f0: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
ca00: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
ca10: 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72   atomic-batch-wr
ca20: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
ca30: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
ca40: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
ca50: 72 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74  ristics().** ret
ca60: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74  urns a value wit
ca70: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  h the SQLITE_IOC
ca80: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
ca90: 62 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a  bit set. -1 is.*
caa0: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
cab0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
cac0: 66 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69  f neither optimi
cad0: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
cae0: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
caf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
cb00: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
cb10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
cb20: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
cb30: 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   );..#if defined
cb40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
cb50: 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20  TOMIC_WRITE) \. 
cb60: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
cb70: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
cb80: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69  TOMIC_WRITE).  i
cb90: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
cbc0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20  cteristics */.. 
cbd0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
cbe0: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
cbf0: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
cc00: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
cc10: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
cc20: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cc30: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cc40: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  r);.#endif..#ifd
cc50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cc60: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
cc70: 49 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72  ITE.  if( pPager
cc80: 2d 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64  ->dbSize>0 && (d
cc90: 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  c&SQLITE_IOCAP_B
cca0: 41 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a  ATCH_ATOMIC) ){.
ccb0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
ccc0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
ccd0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cce0: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b  ATOMIC_WRITE.  {
ccf0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
cd00: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
cd10: 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  rSize;.    int s
cd20: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
cd30: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
cd40: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
cd50: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
cd60: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
cd70: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
cd80: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
cd90: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
cda0: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
cdb0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
cdc0: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
cdd0: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
cde0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cdf0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
ce00: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
ce10: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
ce20: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
ce30: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  r);.#endif..  re
ce40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ce50: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
ce60: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
ce70: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
ce80: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
ce90: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
cea0: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
ceb0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
cec0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
ced0: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
cee0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
cef0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cf00: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
cf10: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
cf20: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
cf30: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
cf40: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cf50: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
cf60: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
cf70: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
cf80: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
cf90: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
cfa0: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
cfb0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
cfc0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
cfd0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
cfe0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
cff0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
d000: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
d010: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
d020: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
d030: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d040: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
d050: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
d060: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
d070: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
d080: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
d090: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
d0a0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
d0b0: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
d0c0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
d0d0: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
d0e0: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
d0f0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
d100: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
d110: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
d120: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
d130: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
d140: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
d150: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
d160: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
d170: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
d180: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
d190: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
d1a0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
d1b0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
d1c0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
d1d0: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
d1e0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
d1f0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
d200: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
d210: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
d220: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
d230: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
d240: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
d250: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
d260: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
d270: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
d280: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
d290: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
d2a0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
d2b0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
d2c0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
d2d0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
d2e0: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
d2f0: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
d300: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
d310: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
d320: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
d330: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
d340: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
d350: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
d360: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
d370: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
d380: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
d390: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d3a0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
d3b0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
d3c0: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
d3d0: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
d3e0: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
d3f0: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
d400: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
d410: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
d420: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
d430: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
d440: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
d450: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d460: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
d470: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
d480: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
d490: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
d4a0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
d4b0: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
d4c0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
d4d0: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
d4e0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
d4f0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
d500: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
d510: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
d520: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
d530: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
d540: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
d550: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
d560: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
d570: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
d580: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
d590: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
d5a0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
d5b0: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
d5c0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
d5d0: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
d5e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
d5f0: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
d600: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d610: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
d620: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d630: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
d640: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
d650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
d660: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
d670: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
d680: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
d690: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
d6a0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
d6b0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
d6c0: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
d6d0: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
d6e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d6f0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
d700: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
d710: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
d720: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d730: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
d740: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
d750: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
d760: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
d770: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d780: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
d790: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
d7a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
d7b0: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
d7c0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d7d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d7e0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d7f0: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
d800: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
d810: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
d820: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d850: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
d880: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
d890: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
d8a0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
d8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
d8c0: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
d8d0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
d8e0: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
d8f0: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d900: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
d910: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
d920: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
d930: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d950: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
d960: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
d970: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
d980: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
d990: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
d9a0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
d9b0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
d9c0: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d9d0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d9e0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d9f0: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
da00: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
da10: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
da20: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
da30: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
da40: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
da50: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73  ter .   || len>s
da60: 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d  zJ-16.   || len=
da70: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
da80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
da90: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
daa0: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
dab0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
dac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
dad0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
dae0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
daf0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
db00: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
db10: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
db20: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
db30: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
db40: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
db50: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
db60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
db70: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
db80: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
db90: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
dba0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
dbb0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
dbc0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
dbd0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
dbe0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
dbf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
dc00: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
dc10: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
dc20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
dc30: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
dc40: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
dc50: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
dc60: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
dc70: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
dc80: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
dc90: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
dca0: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
dcb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
dcc0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
dcd0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
dce0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
dcf0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
dd00: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
dd10: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
dd20: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
dd30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd40: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
dd50: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
dd60: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
dd70: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
dd80: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
dd90: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
dda0: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
ddb0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
ddc0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
ddd0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
dde0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
ddf0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
de00: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
de10: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
de20: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
de30: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de60: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de80: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
ded0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
dee0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
def0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
df00: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
df10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
df20: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
df30: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
df40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
df50: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
df60: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
df70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
df80: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
df90: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
dfa0: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
dfb0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
dfc0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
dfd0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
dfe0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
dff0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
e000: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
e010: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
e020: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
e030: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
e040: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
e050: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
e060: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
e070: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
e080: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
e090: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
e0a0: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
e0b0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
e0c0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
e0d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e0e0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
e0f0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
e100: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
e110: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
e120: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
e130: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
e140: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
e150: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
e160: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
e170: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
e180: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
e190: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
e1a0: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
e1b0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
e1c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e1d0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
e1e0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
e1f0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
e200: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
e210: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
e220: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
e230: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
e240: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
e250: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
e260: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
e270: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
e280: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
e290: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
e2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
e2b0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
e2c0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
e2d0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
e2e0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
e2f0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
e300: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
e310: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
e320: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
e330: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
e340: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
e350: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
e360: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
e370: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
e380: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
e390: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e3a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
e3b0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e3c0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
e3d0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
e3e0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
e3f0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
e400: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e410: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
e420: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
e430: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
e440: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
e450: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e460: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e490: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
e4a0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e4b0: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
e4c0: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
e4d0: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
e4e0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
e4f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e500: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
e510: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
e520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
e530: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
e540: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
e550: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
e560: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
e570: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
e580: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
e590: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
e5a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e5b0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e5c0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
e5d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
e5e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e5f0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
e600: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
e610: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
e620: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
e630: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
e640: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
e650: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e660: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
e670: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
e680: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
e690: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
e6a0: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
e6b0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
e6c0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
e6d0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e6e0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
e6f0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
e700: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
e710: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
e720: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
e730: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
e740: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
e750: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
e760: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
e770: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
e780: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
e790: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
e7a0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
e7b0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
e7c0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
e7d0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
e7e0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
e7f0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
e800: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
e810: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
e820: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
e830: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e840: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
e850: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
e860: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
e870: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
e880: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
e890: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
e8a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
e8b0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
e8c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e8d0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
e8e0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
e8f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e900: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e910: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
e920: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e930: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
e940: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e950: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e960: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e970: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e980: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e990: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e9a0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e9b0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e9c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e9d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e9e0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e9f0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
ea00: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
ea10: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
ea20: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
ea30: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
ea40: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
ea50: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
ea60: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
ea70: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
ea80: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
ea90: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
eaa0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
eab0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
eac0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
ead0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
eae0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
eaf0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
eb00: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
eb10: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
eb20: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
eb30: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
eb40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
eb50: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
eb60: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
eb70: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
eb80: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
eb90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
eba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ebd0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
ebe0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
ebf0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
ec00: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
ec10: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
ec20: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
ec30: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
ec40: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
ec50: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
ec60: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
ec70: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
ec80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ec90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
eca0: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
ecb0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
ecc0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ecf0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
ed00: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
ed10: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
ed20: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
ed30: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
ed40: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
ed50: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ed60: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
ed70: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
ed80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
ed90: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
eda0: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
edb0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
edc0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
edd0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
ede0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
edf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ee00: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
ee10: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
ee20: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
ee30: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
ee40: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
ee50: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
ee60: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
ee70: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
ee80: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
ee90: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
eea0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
eeb0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
eec0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
eed0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
eee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
eef0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef00: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ef10: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ef20: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
ef30: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
ef40: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
ef50: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
ef60: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
ef70: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
ef80: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
ef90: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
efa0: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
efb0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
efc0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
efd0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
efe0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
eff0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
f000: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
f010: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
f020: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
f030: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
f040: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
f050: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
f060: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
f070: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
f080: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
f090: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
f0a0: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
f0b0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
f0c0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
f0d0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
f0e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
f0f0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
f100: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
f110: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
f120: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
f130: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
f140: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
f150: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
f160: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
f170: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
f180: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
f190: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
f1a0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
f1b0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
f1c0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
f1d0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
f1e0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
f1f0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
f200: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
f210: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
f220: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
f230: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
f240: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
f250: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
f260: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
f270: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
f280: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
f290: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f2a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
f2b0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
f2c0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
f2d0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
f2e0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
f2f0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
f300: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
f310: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
f320: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f330: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
f340: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
f350: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
f360: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
f370: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
f380: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
f390: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
f3a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f3b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
f3c0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
f3d0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
f3e0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
f3f0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
f400: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
f410: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f420: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
f430: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f440: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f450: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
f460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
f470: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
f480: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f490: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
f4a0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
f4b0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
f4c0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
f4d0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f4e0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
f4f0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
f500: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f510: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f520: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f530: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
f540: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f550: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
f560: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
f570: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f580: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f590: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
f5a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
f5b0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
f5c0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
f5d0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
f5e0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
f5f0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f600: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f610: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
f620: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
f630: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
f640: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
f650: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f660: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f670: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
f680: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
f690: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
f6a0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
f6b0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
f6c0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
f6d0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
f6e0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
f6f0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
f700: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
f710: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
f720: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
f730: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
f740: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
f750: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
f760: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
f770: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
f780: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
f790: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f7a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
f7b0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
f7c0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
f7d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
f7e0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
f7f0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
f800: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
f810: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
f820: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
f830: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
f840: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
f850: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
f860: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
f870: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
f880: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
f890: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
f8a0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
f8b0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
f8c0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
f8d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
f8e0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
f8f0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
f900: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
f910: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
f920: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
f930: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
f940: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
f950: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f960: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f970: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f980: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f990: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f9a0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f9b0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f9c0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f9d0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f9e0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f9f0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
fa00: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
fa10: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
fa20: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
fa30: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
fa40: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
fa50: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
fa60: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
fa70: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
fa80: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
fa90: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
faa0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fab0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
fac0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
fad0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
fae0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
faf0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
fb00: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
fb10: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
fb20: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
fb30: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
fb40: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
fb50: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
fb60: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
fb70: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
fb80: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
fb90: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
fba0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
fbb0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
fbc0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
fbd0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
fbe0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
fbf0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
fc00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
fc10: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
fc20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fc30: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
fc40: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
fc50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fc60: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
fc70: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fc80: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
fc90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
fca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fcb0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
fcc0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fcd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
fce0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
fcf0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
fd00: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
fd10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fd20: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
fd30: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
fd40: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fd50: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
fd60: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
fd70: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
fd80: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
fd90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fda0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
fdb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fdc0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
fdd0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
fde0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
fdf0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
fe00: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
fe10: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
fe20: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
fe30: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
fe40: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
fe50: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
fe60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
fe70: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
fe80: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
fe90: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
fea0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
feb0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
fec0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
fed0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
fee0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
fef0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
ff00: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
ff10: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
ff20: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
ff30: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
ff40: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
ff50: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
ff60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
ff70: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ff80: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
ff90: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
ffa0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
ffb0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
ffc0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
ffd0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
ffe0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
fff0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
10000 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10020 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
10030 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
10040 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
10050 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
10060 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
10070 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
10080 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
10090 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
100a0 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
100b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
100c0 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
100d0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
100e0 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
100f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
10100 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
10110 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10120 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
10130 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10150 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
10160 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
10170 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
10180 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
101b0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
101c0 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
101d0 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
101e0 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
101f0 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
10200 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10210 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10220 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
10230 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
10240 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
10250 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
10260 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
10270 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
10280 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
10290 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
102a0 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
102b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
102c0 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
102d0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
102e0 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
102f0 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
10300 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
10310 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
10320 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
10330 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
10340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10350 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
10360 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
10370 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
10380 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
10390 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
103a0 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
103b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
103c0 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
103d0 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
103e0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
103f0 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
10400 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
10410 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10420 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
10430 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
10440 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
10450 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
10460 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
10470 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
10480 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
10490 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
104a0 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
104b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
104c0 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
104d0 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
104e0 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
104f0 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
10500 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
10510 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
10520 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
10530 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
10540 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
10550 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
10560 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10570 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
10580 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
10590 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
105a0 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
105b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
105c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
105d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
105e0 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
105f0 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
10600 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
10610 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
10620 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
10630 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
10640 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
10650 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
10660 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
10670 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10680 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
10690 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
106a0 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
106b0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
106c0 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
106d0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
106e0 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
106f0 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
10700 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10710 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10720 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
10730 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
10740 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
10750 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10760 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10770 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
10780 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
10790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
107a0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
107b0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
107c0 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
107d0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
107e0 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
107f0 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
10800 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
10810 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
10820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
10830 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
10840 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
10850 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
10860 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
10870 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
10880 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10890 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
108a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
108b0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
108c0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
108d0 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
108e0 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
108f0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10900 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10910 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10920 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
10930 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
10940 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
10950 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
10960 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
10970 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
10980 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10990 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
109a0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
109b0 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
109c0 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
109d0 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
109e0 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
109f0 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
10a00 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10a10 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10a20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10a30 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10a40 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10a50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10a60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10a70 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10a80 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10a90 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10aa0 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10ab0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10ac0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10ad0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10ae0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10af0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10b00 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10b10 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10b20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10b30 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10b40 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10b50 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10b60 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10b70 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10b80 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10b90 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10ba0 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10bb0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10bc0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10bd0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10be0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10bf0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10c00 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10c10 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10c20 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10c30 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10c40 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10c50 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10c60 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10c70 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10c80 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10c90 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10ca0 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10cb0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10cc0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10cd0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10ce0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10cf0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10d00 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10d10 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10d20 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10d30 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10d40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10d50 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10d60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10d70 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10d80 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10d90 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10da0 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10db0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10dc0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10dd0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10de0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10df0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10e00 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10e10 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10e20 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10e30 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10e40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10e50 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10e60 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10e70 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e90 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10ea0 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10eb0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10ec0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10ed0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10ee0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10ef0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10f00 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10f10 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10f20 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10f30 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10f40 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10f50 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10f60 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10f70 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10f80 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10f90 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10fa0 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10fb0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10fc0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10fd0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10fe0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10ff0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
11000 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
11010 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
11020 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
11030 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
11040 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
11050 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
11060 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
11070 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11080 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
11090 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
110a0 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
110b0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
110c0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
110d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
110e0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
110f0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
11100 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
11110 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
11120 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
11130 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
11140 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
11150 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
11160 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
11170 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
11180 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
11190 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
111a0 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
111b0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
111c0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
111d0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
111e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
111f0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
11200 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
11210 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
11220 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
11230 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
11240 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
11250 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
11260 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11270 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
11280 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
11290 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
112a0 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
112b0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
112c0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
112d0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
112e0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
112f0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
11300 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
11310 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
11320 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
11330 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
11340 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
11350 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
11360 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
11370 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
11380 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
11390 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
113a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
113b0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
113c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
113d0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
113e0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11410 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
11420 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11440 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
11450 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
11460 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11480 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
11490 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
114a0 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
114b0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
114c0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
114d0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
114e0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
114f0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11510 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
11520 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
11530 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11540 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
11550 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
11560 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11570 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
11580 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
11590 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
115a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
115b0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
115c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
115d0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
115e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
115f0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
11600 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
11610 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11620 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
11630 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11640 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
11650 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
11660 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
11670 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
11680 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
11690 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
116a0 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
116b0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
116c0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
116d0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
116e0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
116f0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
11700 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
11710 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
11720 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
11730 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
11740 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
11750 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
11760 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
11770 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
11780 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11790 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
117a0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
117b0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
117c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
117d0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
117e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
117f0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
11800 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
11810 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
11820 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
11830 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
11840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11850 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
11860 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
11870 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11880 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11890 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
118a0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
118b0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
118c0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
118d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
118e0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
118f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11900 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11910 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
11920 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
11930 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
11940 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
11950 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
11960 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
11970 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
11980 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11990 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
119a0 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
119b0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
119c0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
119d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
119e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
119f0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
11a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11a30 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11a40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11a50 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11a60 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11a70 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11a80 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11a90 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11aa0 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11ab0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11ac0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11ad0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11ae0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11af0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
11b00 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11b10 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11b20 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11b30 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11b40 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11b50 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11b60 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11b70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11b80 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11b90 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11ba0 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11bb0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11bc0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11bd0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11be0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11bf0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
11c00 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11c10 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11c20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11c30 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11c40 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11c50 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11c60 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11c70 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11c80 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11c90 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11ca0 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11cb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11cc0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11cd0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11ce0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11cf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11d00 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11d20 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11d30 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11d40 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11d50 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11d60 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11d70 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11d80 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11d90 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11da0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11db0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11dc0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11dd0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11de0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11df0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11e00 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11e10 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11e20 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11e30 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11e40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
11e50 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11e60 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11e70 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11e80 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
11e90 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
11ea0 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
11eb0 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
11ec0 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
11ed0 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
11ee0 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11ef0 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11f00 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11f10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11f20 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11f30 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11f40 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11f50 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11f60 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11f70 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11f80 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
11f90 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11fa0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11fb0 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
11fc0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11fd0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11fe0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11ff0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
12000 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
12010 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
12020 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
12030 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
12040 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  | sqlite3Journal
12050 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
12060 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
12070 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12080 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
12090 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
120a0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
120b0 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
120c0 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
120d0 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
120e0 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
120f0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
12100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12110 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
12120 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
12130 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
12140 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
12150 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
12160 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
12170 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
12180 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
12190 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
121a0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
121b0 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
121c0 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
121d0 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
121e0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
121f0 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12220 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
12230 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
12240 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12250 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
12260 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
12270 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
12280 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
12290 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
122a0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
122b0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
122c0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
122d0 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
122e0 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
122f0 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
12300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
12310 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
12320 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
12340 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
12350 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
12360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12370 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12380 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
12390 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
123a0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
123b0 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  and not.** in th
123c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  e ERROR state. O
123d0 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69  therwise, it swi
123e0 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
123f0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  to PAGER_OPEN.**
12400 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   state..**.** If
12410 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
12420 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  t in exclusive-a
12430 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20  ccess mode, the 
12440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
12450 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  .** completely u
12460 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20  nlocked. If the 
12470 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
12480 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79   and the file-sy
12490 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  stem does.** not
124a0 20 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44   exhibit the UND
124b0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
124c0 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  EN property, the
124d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
124e0 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69  .** closed (if i
124f0 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a  t is open)..**.*
12500 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12510 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  s in ERROR state
12520 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
12530 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
12540 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
12550 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
12560 68 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64  he are discarded
12570 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e   before switchin
12580 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68  g back to .** th
12590 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65  e OPEN state. Re
125a0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
125b0 68 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73  her the pager is
125c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
125d0 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e  de.** or not, an
125e0 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c  y journal file l
125f0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
12600 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74  system will be t
12610 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68  reated.** as a h
12620 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
12630 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e  olled back the n
12640 65 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d  ext time a read-
12650 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12660 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69  s opened (by thi
12670 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65  s or by any othe
12680 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a  r connection)..*
12690 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
126a0 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
126b0 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73   *pPager){..  as
126c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
126d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
126e0 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  ER .       || pP
126f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12700 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20  GER_OPEN .      
12710 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12720 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
12730 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  );..  sqlite3
12740 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
12750 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
12760 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
12770 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
12780 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12790 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
127a0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
127b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
127c0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
127d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
127e0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64     sqlite3WalEnd
127f0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
12800 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12810 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12820 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12830 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
12840 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
12850 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
12860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12870 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
12880 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
12890 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  y pagerUnlockDb(
128a0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63  ) */.    int iDc
128b0 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72   = isOpen(pPager
128c0 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44  ->fd)?sqlite3OsD
128d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
128e0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
128f0 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  :0;..    /* If t
12900 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12910 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65  tem support dele
12920 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c  tion of open fil
12930 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  es, then.    ** 
12940 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
12950 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
12960 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
12970 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69  e lock.  Otherwi
12980 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65  se.    ** anothe
12990 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
129a0 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
129b0 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65  elete might dele
129c0 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  te the file.    
129d0 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
129e0 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
129f0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12a00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12a10 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  RY   & 5)!=1 );.
12a20 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12a30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
12a40 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  FF      & 5)!=1 
12a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
12a60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
12a70 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21  E_WAL      & 5)!
12a80 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a90 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12aa0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20  MODE_DELETE   & 
12ab0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12ac0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12ad0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12ae0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12af0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12b00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
12b10 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ST  & 5)==1 );. 
12b20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26     if( 0==(iDc &
12b30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
12b40 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
12b50 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d  PEN).     || 1!=
12b60 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12b70 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b  Mode & 5).    ){
12b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12b90 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
12ba0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
12bb0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12bc0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12bd0 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c  tate and the cal
12be0 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  l to unlock the 
12bf0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
12c00 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20  file fails, set 
12c10 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
12c20 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
12c30 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
12c40 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74  t.    ** above t
12c50 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55  he #define for U
12c60 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
12c70 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
12c80 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a  f why this.    *
12c90 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  * is necessary..
12ca0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
12cb0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
12cc0 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ager, NO_LOCK);.
12cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12ce0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
12cf0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
12d00 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50  RROR ){.      pP
12d10 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e  ager->eLock = UN
12d20 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20  KNOWN_LOCK;.    
12d30 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  }..    /* The pa
12d40 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65  ger state may be
12d50 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41   changed from PA
12d60 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47  GER_ERROR to PAG
12d70 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20  ER_OPEN here.   
12d80 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61   ** without clea
12d90 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63  ring the error c
12da0 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74  ode. This is int
12db0 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65  entional - the e
12dc0 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
12dd0 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20   is cleared and 
12de0 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20  the cache reset 
12df0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  in the block bel
12e00 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
12e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
12e20 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
12e30 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
12e40 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61  ERROR );.    pPa
12e50 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12e60 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
12e70 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12e80 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a  AGER_OPEN;.  }..
12e90 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
12ea0 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
12eb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ec0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
12ed0 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75  nnot be.  ** tru
12ee0 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
12ef0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12f00 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
12f10 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c  es to the pager,
12f20 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66  .  ** it can saf
12f30 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f  ely move back to
12f40 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
12f50 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  e. This happens 
12f60 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72  in both.  ** nor
12f70 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76  mal and exclusiv
12f80 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
12f90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12fa0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12fb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12fc0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
12fd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12fe0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12ff0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
13000 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
13010 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
13020 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13030 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
13040 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13050 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
13060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13070 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
13080 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
13090 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
130a0 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
130b0 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
130c0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
130d0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
130e0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
130f0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
13100 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73  SQLITE_OK;.    s
13120 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
13130 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  Pager);.  }..  p
13140 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13150 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
13160 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
13170 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
13180 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
13190 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
131a0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
131b0 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
131c0 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
131d0 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
131e0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
131f0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
13200 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
13210 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
13220 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13230 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
13240 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
13250 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
13260 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
13270 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
13280 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
13290 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
132a0 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
132b0 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
132c0 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
132d0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
132e0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
132f0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
13300 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
13310 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
13320 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
13330 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
13340 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
13350 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
13360 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
13370 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
13380 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
13390 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
133a0 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
133b0 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
133c0 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
133d0 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
133e0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
133f0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
13400 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
13410 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
13420 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
13430 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
13440 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
13450 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
13460 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
13470 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
13480 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
13490 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
134a0 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
134b0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
134c0 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
134d0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
134e0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
134f0 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
13500 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
13510 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
13520 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
13530 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
13540 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
13550 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
13560 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
13570 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
13580 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
13590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
135a0 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
135b0 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
135c0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
135d0 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
135e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
135f0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
13600 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
13610 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13620 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
13630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
13640 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
13650 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
13660 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
13670 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
13680 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
13690 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
136a0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
136b0 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
136c0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
136d0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
136e0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
136f0 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
13700 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
13710 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13720 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
13730 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13740 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13750 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
13760 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  he write transac
13770 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61  tion open on pPa
13780 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ger is being com
13790 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d  mitted (bCommit=
137a0 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64  =1).** or rolled
137b0 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d   back (bCommit==
137c0 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)..**.** Return
137d0 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c   TRUE if and onl
137e0 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70  y if all dirty p
137f0 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ages should be f
13800 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a  lushed to disk..
13810 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a  **.** Rules:.**.
13820 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d  **   *  For non-
13830 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20  TEMP databases, 
13840 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64  always sync to d
13850 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  isk.  This is ne
13860 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20  cessary.**      
13870 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  for transactions
13880 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a   to be durable..
13890 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20  **.**   *  Sync 
138a0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e  TEMP database on
138b0 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28  ly on a COMMIT (
138c0 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20  not a ROLLBACK) 
138d0 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67  when the backing
138e0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61  .**      file ha
138f0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61  s been created a
13900 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70  lready (via a sp
13910 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65  ill on pagerStre
13920 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20  ss()) and.**    
13930 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65    when the numbe
13940 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  r of dirty pages
13950 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65   in memory excee
13960 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f  ds 25% of the to
13970 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68  tal.**      cach
13980 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
13990 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68  c int pagerFlush
139a0 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  OnCommit(Pager *
139b0 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d  pPager, int bCom
139c0 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67  mit){.  if( pPag
139d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
139e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
139f0 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74  ( !bCommit ) ret
13a00 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73  urn 0;.  if( !is
13a10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
13a20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
13a30 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43  eturn (sqlite3PC
13a40 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79  achePercentDirty
13a50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13a60 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )>=25);.}../*.**
13a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
13a80 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
13a90 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
13aa0 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
13ab0 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
13ac0 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
13ad0 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
13ae0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13af0 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
13b00 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
13b10 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
13b20 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
13b30 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
13b40 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
13b50 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
13b60 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
13b70 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
13b80 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
13b90 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
13ba0 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13bb0 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
13bc0 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
13bd0 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
13be0 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
13bf0 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
13c00 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
13c10 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
13c20 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
13c30 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
13c40 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
13c50 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13c60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
13c70 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
13c80 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
13c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
13ca0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13cb0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
13cc0 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
13cd0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
13ce0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
13cf0 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
13d00 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
13d10 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
13d20 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
13d30 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
13d40 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
13d50 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
13d60 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
13d70 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
13d80 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
13d90 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
13da0 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13db0 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
13dc0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13dd0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
13de0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
13df0 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
13e00 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
13e10 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
13e20 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
13e30 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
13e40 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13e50 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
13e60 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
13e70 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
13e80 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
13e90 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
13ea0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
13eb0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
13ec0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
13ed0 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
13ee0 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
13ef0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
13f00 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
13f10 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13f20 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
13f30 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
13f40 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
13f50 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
13f60 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
13f70 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
13f80 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
13f90 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
13fa0 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
13fb0 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
13fc0 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
13fd0 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
13fe0 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
13ff0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
14000 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
14010 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
14020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
14030 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
14040 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
14050 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
14060 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
14070 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
14080 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
14090 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
140a0 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
140b0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
140c0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
140d0 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
140e0 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
140f0 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
14100 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
14110 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
14120 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
14130 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
14140 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
14150 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
14160 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
14170 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
14180 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
14190 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
141a0 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
141b0 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
141c0 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
141d0 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
141e0 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
141f0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
14200 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
14210 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
14220 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14230 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
14240 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
14250 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14260 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
14270 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
14280 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
14290 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
142a0 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
142b0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
142c0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
142d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
142e0 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
142f0 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
14300 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
14310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14320 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
14330 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
14340 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
14350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14360 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
14370 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
14380 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
14390 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
143a0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
143b0 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
143c0 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
143d0 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
143e0 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
143f0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
14400 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
14410 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
14420 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
14430 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
14440 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
14450 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
14460 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
14470 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14480 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14490 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
144a0 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
144b0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
144c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
144d0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
144e0 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
144f0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
14500 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
14510 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
14520 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
14530 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
14540 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
14550 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
14560 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
14570 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
14580 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
14590 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
145a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
145b0 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
145c0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
145d0 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
145e0 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
145f0 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
14600 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
14610 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
14620 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
14630 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
14640 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
14650 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
14660 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14670 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
14680 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
14690 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
146a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
146b0 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
146c0 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
146d0 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
146e0 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
146f0 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
14700 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
14710 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
14720 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
14730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14740 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
14750 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14760 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
14770 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14780 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
14790 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
147a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
147b0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
147c0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
147d0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
147e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
147f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
14800 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14810 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
14820 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
14830 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
14840 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
14850 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14860 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
14870 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
14880 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
14890 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
148a0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
148b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a  >pInJournal==0 .
148c0 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
148d0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
148e0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
148f0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
14900 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a  P_BATCH_ATOMIC).
14910 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65    );.  if( isOpe
14920 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
14930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14940 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14950 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
14960 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
14970 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
14980 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
14990 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
149a0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
149b0 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
149c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
149d0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
149e0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
149f0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14a00 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14a10 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14a20 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14a30 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14a40 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
14a50 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
14a60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14a70 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
14a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14ab0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14ac0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14ad0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14ae0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14af0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14b00 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14b10 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14b20 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14b30 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14b40 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14b50 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
14b60 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
14b70 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
14b80 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
14b90 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
14ba0 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
14bb0 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14bc0 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14bd0 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
14be0 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
14bf0 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
14c00 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
14c10 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
14c20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14c30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14c40 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14c50 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
14c60 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
14c70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14c80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14c90 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
14ca0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14cb0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14cc0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14cd0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
14ce0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14cf0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14d00 6e 61 6c 4d 6f 64 65 3c 50 41 47 45 52 5f 4a 4f  nalMode<PAGER_JO
14d10 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
14d20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
14d30 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
14d40 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
14d50 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  r||pPager->tempF
14d60 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ile);.      pPag
14d70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14d80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14d90 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
14da0 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75  nch may be execu
14db0 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a  ted with Pager.j
14dc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
14dd0 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61  RY if.      ** a
14de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73   hot-journal was
14df0 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63   just rolled bac
14e00 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  k. In this case 
14e10 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
14e20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64    ** file should
14e30 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   be closed and d
14e40 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20  eleted. If this 
14e50 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
14e60 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
14e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
14e80 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75   it will do so u
14e90 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  sing an in-memor
14ea0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  y journal..     
14eb0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44   */.      int bD
14ec0 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d  elete = !pPager-
14ed0 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20  >tempFile;.     
14ee0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14ef0 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14f00 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d  y(pPager->jfd)==
14f10 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14f20 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14f30 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14f40 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
14f50 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14f60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14f70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14f80 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
14f90 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
14fa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14fb0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14fc0 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  ODE_WAL.        
14fd0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
14fe0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14ff0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
15000 32 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  2.      );.     
15010 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
15020 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
15030 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
15040 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15050 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
15060 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
15070 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
15080 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
15090 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
150a0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
150b0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
150c0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
150d0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
150e0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
150f0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
15100 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15110 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
15120 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
15130 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
15140 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
15150 48 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  Hdr *p = sqlite3
15160 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
15170 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  er, 1);.    if( 
15180 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61  p ){.      p->pa
15190 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  geHash = 0;.    
151a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
151b0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20  refNotNull(p);. 
151c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
151d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
151e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
151f0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
15200 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
15210 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
15220 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
15230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15240 7b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  {.    if( MEMDB 
15250 7c 7c 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43  || pagerFlushOnC
15260 6f 6d 6d 69 74 28 70 50 61 67 65 72 2c 20 62 43  ommit(pPager, bC
15270 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20  ommit) ){.      
15280 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
15290 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
152a0 43 61 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Cache);.    }els
152b0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
152c0 50 63 61 63 68 65 43 6c 65 61 72 57 72 69 74 61  PcacheClearWrita
152d0 62 6c 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ble(pPager->pPCa
152e0 63 68 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  che);.    }.    
152f0 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75  sqlite3PcacheTru
15300 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50  ncate(pPager->pP
15310 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64  Cache, pPager->d
15320 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  bSize);.  }..  i
15330 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
15340 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
15350 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72   Drop the WAL wr
15360 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79  ite-lock, if any
15370 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63  . Also, if the c
15380 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e  onnection was in
15390 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   .    ** locking
153a0 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
153b0 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c  mode but is no l
153c0 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20  onger, drop the 
153d0 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a  EXCLUSIVE .    *
153e0 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  * lock held on t
153f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32  ..    */.    rc2
15410 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64   = sqlite3WalEnd
15420 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
15430 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
15440 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32 3d      assert( rc2=
15450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15460 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
15470 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d  LITE_OK && bComm
15480 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  it && pPager->db
15490 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d  FileSize>pPager-
154a0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f  >dbSize ){.    /
154b0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
154c0 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d   taken when comm
154d0 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
154e0 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b  tion in rollback
154f0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20  -journal.    ** 
15500 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61 74 61  mode if the data
15510 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
15520 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  k is larger than
15530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
15540 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74  age..    ** At t
15550 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f  his point the jo
15560 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66  urnal has been f
15570 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65  inalized and the
15580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
15590 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
155a0 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74  y committed, but
155b0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
155c0 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c  ock is still hel
155d0 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  d on the.    ** 
155e0 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73  file. So it is s
155f0 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20  afe to truncate 
15600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15610 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
15620 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64  .    ** required
15630 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61   size.  */.    a
15640 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
15650 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
15660 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  LOCK );.    rc =
15670 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
15680 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
15690 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  dbSize);.  }..  
156a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
156b0 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 29 7b 0a  K && bCommit ){.
156c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
156d0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
156e0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
156f0 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48  _FCNTL_COMMIT_PH
15700 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20  ASETWO, 0);.    
15710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
15720 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53  OTFOUND ) rc = S
15730 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15740 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
15750 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
15760 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61 6c  && (!pagerUseWal
15770 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69  (pPager) || sqli
15780 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
15790 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
157a0 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  , 0)).  ){.    r
157b0 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b  c2 = pagerUnlock
157c0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
157d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
157e0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
157f0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Done = 0;.  }.  
15800 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
15810 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
15820 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
15830 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  er = 0;..  retur
15840 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
15850 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
15860 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
15870 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
15880 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
15890 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
158a0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
158b0 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  e. .**.** If the
158c0 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
158d0 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45  dy entered the E
158e0 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e  RROR state, do n
158f0 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74  ot attempt .** t
15900 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74  he rollback at t
15910 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61  his time. Instea
15920 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  d, pager_unlock(
15930 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65  ) is called. The
15940 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
15950 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
15960 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d  discard all in-m
15970 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c  emory pages, unl
15980 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ock.** the datab
15990 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76  ase file and mov
159a0 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  e the pager back
159b0 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20   to OPEN state. 
159c0 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e  If this .** mean
159d0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
159e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
159f0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
15a00 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
15a10 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  .** connection t
15a20 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
15a30 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  d lock on the pa
15a40 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62  ger (which may b
15a50 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20  e this one) .** 
15a60 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63  will roll it bac
15a70 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15a80 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c  pager has not al
15a90 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15aa0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
15ab0 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d  ut an IO or.** m
15ac0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
15ad0 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  rs during a roll
15ae0 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20  back, then this 
15af0 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73  will itself caus
15b00 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  e .** the pager 
15b10 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52  to enter the ERR
15b20 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68 20  OR state. Which 
15b30 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
15b40 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  by the.** call t
15b50 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
15b60 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  , as described a
15b70 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bove..*/.static 
15b80 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
15b90 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
15ba0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
15bb0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15bc0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26  !=PAGER_ERROR &&
15bd0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
15be0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
15bf0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
15c00 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
15c10 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  ager) );.    if(
15c20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
15c30 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
15c40 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71  CKED ){.      sq
15c50 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
15c60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
15c70 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
15c80 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
15c90 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
15ca0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15cb0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
15cc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
15cd0 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  de ){.      asse
15ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
15cf0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
15d00 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   );.      pager_
15d10 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
15d20 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
15d30 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72     }.  }.  pager
15d40 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
15d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
15d60 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
15d70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
15d80 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
15d90 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
15da0 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
15db0 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
15dc0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
15dd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15de0 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
15df0 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
15e00 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
15e10 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
15e20 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
15e30 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
15e40 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
15e50 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
15e60 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
15e70 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
15e80 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
15e90 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
15ea0 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
15eb0 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
15ec0 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
15ed0 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
15ee0 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
15ef0 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
15f00 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
15f10 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
15f20 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
15f30 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
15f40 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
15f50 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
15f60 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
15f70 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
15f80 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
15f90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
15fa0 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
15fb0 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
15fc0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
15fd0 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
15fe0 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
15ff0 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
16000 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
16010 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
16020 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
16030 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
16040 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
16050 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
16060 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
16070 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
16080 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
16090 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
160a0 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
160b0 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
160c0 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
160d0 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
160e0 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
160f0 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
16100 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
16110 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
16120 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
16130 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
16140 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
16150 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
16160 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16170 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
16180 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
16190 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
161a0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
161b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
161c0 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
161d0 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
161e0 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
161f0 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
16200 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
16210 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72 72   Report the curr
16220 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ent page size an
16230 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  d number of rese
16240 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a  rved bytes back.
16250 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e  ** to the codec.
16260 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
16270 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74  E_HAS_CODEC.stat
16280 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65 70  ic void pagerRep
16290 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ortSize(Pager *p
162a0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
162b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
162c0 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67  Chng ){.    pPag
162d0 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
162e0 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  ng(pPager->pCode
162f0 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c, pPager->pageS
16300 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65  (int)pPager->nRe
16330 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65  serve);.  }.}.#e
16340 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
16350 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20  erReportSize(X) 
16360 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20      /* No-op if 
16370 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
16380 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e  t a codec */.#en
16390 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
163a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a  TE_HAS_CODEC./*.
163b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
163c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
163d0 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65 20  ved bits is the 
163e0 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74  same in the dest
163f0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72  ination.** pager
16400 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68 65   as it is in the
16410 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63   source.  This c
16420 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20 56  omes up when a V
16430 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68  ACUUM changes th
16440 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
16450 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f 20  eserved bits to 
16460 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d  the "optimal" am
16470 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
16480 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52  lite3PagerAlignR
16490 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70 44  eserve(Pager *pD
164a0 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63  est, Pager *pSrc
164b0 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  ){.  if( pDest->
164c0 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e  nReserve!=pSrc->
164d0 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20  nReserve ){.    
164e0 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20  pDest->nReserve 
164f0 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  = pSrc->nReserve
16500 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
16510 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20  tSize(pDest);.  
16520 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
16530 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
16540 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
16550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16560 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
16570 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
16580 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
16590 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
165a0 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
165b0 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
165c0 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
165d0 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
165e0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
165f0 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
16600 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
16610 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
16620 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
16630 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
16640 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20  .**.** The main 
16650 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16660 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20   uses checksums 
16670 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  - the statement 
16680 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a  journal does .**
16690 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
166a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
166b0 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
166c0 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
166d0 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
166e0 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
166f0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
16700 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
16710 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
16720 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
16730 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
16740 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
16750 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
16760 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
16770 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
16780 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
16790 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
167a0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
167b0 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
167c0 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
167d0 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
167e0 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
167f0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
16800 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
16810 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
16820 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
16830 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
16840 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
16850 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
16860 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
16870 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
16880 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
16890 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
168a0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
168b0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
168c0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
168d0 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
168e0 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
168f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
16900 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
16910 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
16920 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
16930 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
16950 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
16960 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
16970 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
16980 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
16990 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
169a0 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
169b0 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
169c0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
169d0 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
169e0 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
169f0 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
16a00 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
16a10 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
16a20 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
16a30 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
16a40 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
16a50 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
16a60 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
16a70 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
16a80 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
16a90 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
16aa0 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
16ab0 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
16ac0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
16ad0 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
16ae0 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
16af0 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
16b00 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
16b10 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
16b20 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
16b30 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
16b40 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
16b50 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
16b60 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
16b70 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
16b80 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
16b90 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
16ba0 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
16bb0 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
16bc0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
16bd0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
16be0 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
16bf0 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
16c00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
16c10 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
16c20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
16c30 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
16c40 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16c50 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16c60 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
16c70 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
16c80 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73   */.  i64 *pOffs
16c90 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  et,             
16ca0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
16cb0 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62   record to playb
16cc0 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
16cd0 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20  *pDone,         
16ce0 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
16cf0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
16d00 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
16d10 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e  .  int isMainJrn
16d20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16d30 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f   /* 1 -> main jo
16d40 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d  urnal. 0 -> sub-
16d50 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e  journal. */.  in
16d60 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20  t isSavepnt     
16d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16d80 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
16d90 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
16da0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
16db0 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16dd0 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
16de0 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
16df0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
16e20 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
16e30 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
16e40 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
16e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16e60 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
16e70 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
16e80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74   */.  char *aDat
16e90 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
16ea0 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
16eb0 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
16ec0 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
16ed0 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
16ee0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ef0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16f00 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
16f10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  file */.  int is
16f20 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20  Synced;         
16f30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
16f40 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  if journal page 
16f50 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66  is synced */.#if
16f60 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
16f70 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72  ODEC.  /* The jr
16f80 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72  nlEnc flag is tr
16f90 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61  ue if Journal pa
16fa0 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61  ges should be pa
16fb0 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  ssed through.  *
16fc0 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74  * the codec.  It
16fd0 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75   is false for pu
16fe0 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  re in-memory jou
16ff0 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73  rnals. */.  cons
17000 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20  t int jrnlEnc = 
17010 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70  (isMainJrnl || p
17020 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
17030 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a  ory==0);.#endif.
17040 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
17050 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
17060 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
17070 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
17080 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
17090 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
170a0 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
170b0 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
170c0 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
170d0 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
170e0 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
170f0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
17100 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
17110 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
17120 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
17130 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
17140 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
17150 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
17160 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
17170 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
17180 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
17190 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
171a0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
171b0 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
171c0 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
171d0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
171e0 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
171f0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
17200 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
17210 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
17220 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
17230 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
17240 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
17250 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
17260 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
17270 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
17280 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
17290 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
172a0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
172b0 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
172c0 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
172d0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
172e0 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
172f0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
17300 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
17310 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
17320 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
17330 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
17340 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
17350 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
17360 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
17370 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17380 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
17390 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
173a0 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
173b0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
173c0 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
173d0 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
173e0 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
173f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17400 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
17410 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
17420 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
17430 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
17440 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
17450 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
17460 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
17470 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
17480 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
17490 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
174a0 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
174b0 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
174c0 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
174d0 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
174e0 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
174f0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
17500 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
17510 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
17520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17530 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
17540 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
17550 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
17560 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17570 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
17580 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17590 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
175a0 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
175b0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
175c0 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
175d0 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
175e0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
175f0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
17600 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
17610 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
17620 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
17630 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
17640 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
17650 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
17660 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
17670 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
17680 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
17690 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
176a0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
176b0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
176c0 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
176d0 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
176e0 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
176f0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
17700 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
17710 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
17720 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
17730 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
17740 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
17750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17760 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
17770 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
17780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
17790 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
177a0 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
177b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
177c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
177d0 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
177e0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
177f0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
17800 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
17810 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
17820 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
17830 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
17840 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
17850 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
17860 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
17870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17880 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
17890 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
178a0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
178b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66   played back bef
178c0 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
178d0 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
178e0 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
178f0 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
17900 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
17910 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
17920 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
17930 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
17940 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
17950 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17960 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
17970 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
17980 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
17990 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
179a0 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
179b0 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
179c0 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
179d0 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
179e0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
179f0 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
17a00 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
17a10 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
17a20 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
17a30 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
17a40 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
17a50 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
17a60 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
17a70 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
17a80 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17a90 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
17aa0 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
17ab0 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
17ac0 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
17ad0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
17ae0 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
17af0 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
17b00 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
17b10 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
17b20 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
17b30 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
17b40 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
17b50 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
17b60 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
17b70 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
17b80 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
17b90 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
17ba0 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
17bb0 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
17bc0 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
17bd0 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
17be0 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
17bf0 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
17c00 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
17c10 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
17c20 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
17c30 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
17c40 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
17c50 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
17c60 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
17c70 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
17c80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
17c90 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
17ca0 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
17cb0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
17cc0 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
17cd0 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
17ce0 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
17cf0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
17d00 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
17d10 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
17d20 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
17d30 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
17d40 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
17d50 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
17d60 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
17d70 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17d80 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17d90 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
17da0 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
17db0 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17dc0 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
17dd0 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
17de0 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
17df0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
17e00 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
17e10 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
17e20 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
17e30 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
17e40 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
17e50 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17e60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
17e70 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
17e80 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
17e90 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
17ea0 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
17eb0 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
17ec0 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
17ed0 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17ee0 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
17ef0 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
17f00 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
17f10 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
17f20 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17f30 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
17f40 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
17f50 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
17f60 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17f70 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
17f80 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
17f90 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
17fa0 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17fb0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
17fc0 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
17fd0 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
17fe0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17ff0 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
18000 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
18010 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
18020 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
18030 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
18040 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
18050 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
18060 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
18070 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
18080 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
18090 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
180a0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
180b0 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
180c0 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
180d0 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
180e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
180f0 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
18100 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
18110 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
18120 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
18130 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
18140 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
18150 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
18160 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
18170 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
18180 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
18190 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
181a0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
181b0 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
181c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
181d0 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
181e0 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
181f0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
18200 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
18210 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
18220 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
18230 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
18240 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
18250 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
18260 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
18270 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
18280 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
18290 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
182a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
182b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
182c0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
182d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
182e0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
182f0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20  EN || pPg==0 || 
18300 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18310 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
18320 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
18330 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
18340 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
18350 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
18360 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
18370 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
18380 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
18390 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
183a0 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
183b0 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
183c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
183d0 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
183e0 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
183f0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
18400 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
18410 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
18420 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
18430 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
18440 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
18450 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
18460 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
18470 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
18480 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
18490 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
184a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
184b0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
184c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
184d0 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
184e0 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
184f0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
18500 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
18510 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
18520 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
18530 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
18540 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
18550 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
18560 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
18570 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
18580 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
18590 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20 72  Write the data r
185a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
185b0 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74  rnal back into t
185c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
185d0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73  ..    ** This is
185e0 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76   usually safe ev
185f0 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70  en for an encryp
18600 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20 61  ted database - a
18610 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  s the data.    *
18620 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64 20  * was encrypted 
18630 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77 72  before it was wr
18640 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
18650 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65  rnal file. The e
18660 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  xception.    ** 
18670 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20 77  is if the data w
18680 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  as just read fro
18690 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  m an in-memory s
186a0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74  ub-journal. In t
186b0 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  hat.    ** case 
186c0 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79  it must be encry
186d0 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72 65  pted here before
186e0 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
186f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
18700 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f      ** file.  */
18710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18720 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28  AS_CODEC.    if(
18730 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20   !jrnlEnc ){.   
18740 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
18750 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
18760 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
18770 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a  M_BKPT, aData);.
18780 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18790 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
187a0 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74  ->fd, (u8 *)aDat
187b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
187c0 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
187d0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
187e0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
187f0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
18800 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73  _BKPT);.    }els
18810 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  e.#endif.    rc 
18820 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
18830 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
18840 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
18850 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
18860 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  );..    if( pgno
18870 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
18880 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
18890 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
188a0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  = pgno;.    }.  
188b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
188c0 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20  ackup ){.#ifdef 
188d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
188e0 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45  .      if( jrnlE
188f0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f  nc ){.        CO
18900 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
18910 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
18920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18930 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  T);.        sqli
18940 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
18950 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
18960 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
18970 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  a);.        CODE
18980 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C2(pPager, aData
18990 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51  , pgno, 7, rc=SQ
189a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c  LITE_NOMEM_BKPT,
189b0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65  aData);.      }e
189c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
189d0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
189e0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
189f0 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
18a00 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  )aData);.    }. 
18a10 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
18a20 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
18a30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
18a40 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
18a50 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
18a60 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
18a70 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18a80 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18a90 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
18aa0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
18ab0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
18ac0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
18ad0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
18ae0 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
18af0 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
18b00 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
18b10 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
18b20 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18b30 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
18b40 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
18b50 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
18b60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18b70 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
18b80 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
18b90 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
18ba0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
18bb0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
18bc0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
18bd0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
18be0 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
18bf0 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
18c00 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
18c10 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
18c20 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
18c30 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
18c40 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
18c50 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
18c60 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
18c70 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
18c80 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
18c90 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
18ca0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
18cb0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
18cc0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
18cd0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
18ce0 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
18cf0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
18d00 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
18d10 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
18d20 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
18d30 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
18d40 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
18d50 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
18d60 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
18d70 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
18d80 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
18d90 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
18da0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
18db0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
18dc0 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e  rt( (pPager->doN
18dd0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
18de0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30  LAG_ROLLBACK)==0
18df0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
18e00 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
18e10 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
18e20 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18e30 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
18e40 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
18e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18e60 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18e70 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
18e80 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20  OLLBACK)!=0 );. 
18e90 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
18ea0 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46  Spill &= ~SPILLF
18eb0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  LAG_ROLLBACK;.  
18ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18ed0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
18ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
18ef0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
18f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
18f10 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
18f20 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
18f30 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
18f40 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
18f50 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
18f60 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
18f70 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
18f80 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
18f90 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
18fa0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
18fb0 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
18fc0 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
18fd0 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
18fe0 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
18ff0 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
19000 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
19010 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
19020 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
19030 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
19040 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
19050 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
19060 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
19070 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
19080 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
19090 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
190a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
190b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
190c0 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
190d0 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  /* It used to be
190e0 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63 61   that sqlite3Pca
190f0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67  cheMakeClean(pPg
19100 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72  ) was called her
19110 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74  e.  But.    ** t
19120 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e  hat call was dan
19130 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e  gerous and had n
19140 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e  o detectable ben
19150 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20 63  efit since the c
19160 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ache.    ** is n
19170 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20  ormally cleaned 
19180 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  by sqlite3Pcache
19190 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72  CleanAll() after
191a0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f   rollback and so
191b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
191c0 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20   removed. */.   
191d0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
191e0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
191f0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
19200 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
19210 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
19220 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
19230 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
19240 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
19250 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
19260 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19270 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19280 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
19290 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
192a0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
192b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
192c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
192d0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
192e0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
192f0 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  /.#if SQLITE_HAS
19300 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a  _CODEC.    if( j
19310 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31  rnlEnc ){ CODEC1
19320 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
19330 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
19340 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
19350 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20  PT); }.#endif.  
19360 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19370 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
19380 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19390 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
193a0 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
193b0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
193c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
193d0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
193e0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
193f0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
19400 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19410 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
19420 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
19430 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
19440 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
19450 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
19460 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19470 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
19480 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
19490 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
194a0 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
194b0 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
194c0 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
194d0 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
194e0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
194f0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
19500 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
19510 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
19520 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
19530 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
19540 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
19550 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
19560 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
19570 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
19580 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
19590 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
195a0 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
195b0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
195c0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
195d0 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
195e0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
195f0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
19600 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
19610 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
19620 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
19630 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
19640 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
19650 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
19660 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
19670 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
19680 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
19690 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
196a0 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
196b0 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
196c0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
196d0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
196e0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
196f0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
19700 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
19710 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
19720 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
19730 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
19740 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
19750 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
19760 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
19770 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
19780 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
19790 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
197a0 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
197b0 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
197c0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
197d0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
197e0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
197f0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
19800 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
19810 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
19820 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
19830 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
19840 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
19850 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
19860 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
19870 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
19880 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
19890 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
198a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
198b0 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
198c0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
198d0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
198e0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
198f0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
19900 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
19910 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
19920 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
19930 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
19940 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
19950 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
19960 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19970 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
19980 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
19990 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
199a0 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
199b0 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
199c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
199d0 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
199e0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
199f0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
19a00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
19a10 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
19a20 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
19a30 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
19a40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
19a50 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
19a60 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
19a70 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
19a80 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
19a90 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
19aa0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
19ab0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19ac0 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
19ad0 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
19ae0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
19af0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
19b00 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
19b10 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
19b20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19b30 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
19b40 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
19b50 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
19b60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
19b70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
19b80 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
19bb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
19bc0 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
19bd0 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
19be0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
19bf0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
19c00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
19c10 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
19c20 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
19c30 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
19c40 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
19c50 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
19c60 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
19c70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19c80 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
19c90 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
19ca0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
19cb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19cc0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
19cd0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
19ce0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
19cf0 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
19d00 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
19d10 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
19d20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
19d30 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
19d40 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
19d50 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
19d60 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
19d70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
19d80 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
19d90 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
19da0 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
19db0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
19dc0 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
19dd0 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
19de0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
19df0 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
19e00 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
19e10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19e20 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
19e30 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
19e40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
19e50 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
19e60 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
19e70 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
19e80 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
19e90 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
19ea0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
19eb0 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
19ec0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
19ed0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19ee0 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BKPT;.  }else{.
19ef0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
19f00 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
19f10 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
19f20 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
19f30 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
19f40 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19f50 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
19f60 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
19f70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
19f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19f90 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19fa0 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20  ..  /* Load the 
19fb0 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
19fc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
19fd0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
19fe0 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  rom.  ** sqlite3
19ff0 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
1a000 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
1a010 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c  terJournal.   Al
1a020 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73  so obtain.  ** s
1a030 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1a040 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20  (in zMasterPtr) 
1a050 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65  to hold the name
1a060 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a  s of master.  **
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65   journal files e
1a080 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65  xtracted from re
1a090 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a  gular rollback-j
1a0a0 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
1a0b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1a0c0 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
1a0d0 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
1a0e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a0f0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
1a100 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d  master_out;.  nM
1a110 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d  asterPtr = pVfs-
1a120 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
1a130 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
1a140 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1a150 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
1a160 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29   nMasterPtr + 1)
1a170 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ;.  if( !zMaster
1a180 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72  Journal ){.    r
1a190 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a1a0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
1a1b0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a1c0 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20   }.  zMasterPtr 
1a1d0 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  = &zMasterJourna
1a1e0 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
1a1f0 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  +1];.  rc = sqli
1a200 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65  te3OsRead(pMaste
1a210 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
1a220 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a  l, (int)nMasterJ
1a230 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66  ournal, 0);.  if
1a240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a250 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
1a260 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  _out;.  zMasterJ
1a270 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
1a280 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a  urnal] = 0;..  z
1a290 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
1a2a0 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c  rJournal;.  whil
1a2b0 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
1a2c0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
1a2d0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
1a2e0 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
1a2f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a300 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
1a310 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
1a320 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
1a330 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20  xists);.    if( 
1a340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a350 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
1a360 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
1a370 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20  .    if( exists 
1a380 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ){.      /* One 
1a390 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
1a3a0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
1a3b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a3c0 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a   exists..      *
1a3d0 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
1a3e0 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
1a3f0 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
1a400 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
1a410 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
1a420 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
1a430 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a440 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  al file..      *
1a450 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20  /.      int c;. 
1a460 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
1a470 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a480 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a490 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a4a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a4b0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a4c0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a4d0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a4e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a4f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a500 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a510 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a520 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a530 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a540 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a550 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a560 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a570 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a580 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a5a0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a5b0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a5c0 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a5d0 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a5e0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a5f0 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a600 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a610 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a620 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a630 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a640 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a650 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a660 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a680 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a690 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a6a0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a6b0 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a6c0 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a6d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a6e0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a6f0 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a700 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a710 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a720 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a730 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a740 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a750 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a760 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a770 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a780 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a790 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a7a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a7b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a7c0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a7d0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a7e0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a7f0 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a800 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a810 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a820 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a830 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a840 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a850 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a860 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a870 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a880 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a890 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a8a0 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a8b0 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a8c0 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a8d0 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a8e0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a8f0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a900 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a910 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a920 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a930 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a940 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a950 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a960 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a970 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a980 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a990 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a9a0 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a9b0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a9c0 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a9d0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a9e0 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1a9f0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1aa00 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1aa10 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1aa20 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1aa30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1aa40 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1aa50 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1aa60 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1aa70 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1aa80 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1aa90 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1aaa0 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1aab0 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1aac0 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1aad0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1aae0 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1aaf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1ab00 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1ab10 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1ab20 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1ab30 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1ab40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1ab50 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1ab60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ab70 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1ab80 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1ab90 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1aba0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1abb0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1abc0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1abd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1abe0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1abf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ac00 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1ac10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ac20 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1ac30 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1ac40 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1ac50 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1ac60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1ac70 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1ac80 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1ac90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1aca0 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1acb0 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1acc0 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1acd0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1ace0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1acf0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1ad00 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1ad10 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1ad20 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1ad30 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1ad40 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1ad50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ad60 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ad70 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1ad80 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1ad90 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1ada0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1adb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1adc0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1add0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1ade0 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1adf0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1ae00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1ae10 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1ae20 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1ae30 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1ae40 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1ae50 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1ae60 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1ae70 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ae80 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1ae90 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1aea0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1aeb0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1aec0 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1aed0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1aee0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1aef0 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1af00 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1af10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1af20 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1af30 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1af40 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1af50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1af60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1af70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1af80 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1af90 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1afa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1afb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1afc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1afd0 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1afe0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1aff0 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1b000 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1b010 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1b020 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1b030 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1b040 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1b050 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1b060 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1b070 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1b080 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1b090 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1b0a0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1b0b0 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1b0c0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1b0d0 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1b0e0 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1b0f0 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1b100 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1b110 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1b120 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1b130 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1b140 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b150 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b160 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b170 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b180 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b190 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b1a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b1b0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b1c0 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b1d0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b1e0 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b1f0 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b200 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b210 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b220 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b230 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b240 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b250 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b260 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b270 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b280 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b290 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b2a0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b2b0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b2c0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b2d0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b2e0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b2f0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b300 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b310 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b320 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b330 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b340 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b350 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b360 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b370 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b380 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b390 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b3a0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b3b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b3c0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b3d0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b3e0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b3f0 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b400 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b410 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b420 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b430 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b440 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b450 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b460 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b470 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b480 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b490 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b4a0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b4b0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b4c0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b4d0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b4e0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b4f0 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b500 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b510 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b520 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b530 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b540 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b550 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b560 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b570 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b580 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b590 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b5a0 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b5b0 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b5c0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b5d0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b5e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b5f0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b600 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b610 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b620 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b630 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b640 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b650 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b660 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b670 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b680 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b6a0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b6b0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b6c0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b6d0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b6e0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b6f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b700 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b710 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b720 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b730 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b740 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b750 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b760 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b770 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b780 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b7a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b7b0 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b7c0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b7d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b7e0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b7f0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b800 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b810 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b820 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b830 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b840 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b850 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b860 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b870 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b880 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b890 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b8a0 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b8b0 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b8c0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b8d0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b8e0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b8f0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b900 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b910 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b920 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b930 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b940 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b950 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b960 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b970 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b980 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b990 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b9a0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b9b0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b9c0 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b9d0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b9e0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1b9f0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1ba00 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1ba10 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1ba20 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1ba30 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1ba40 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1ba50 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1ba60 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ba70 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ba80 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1ba90 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1baa0 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1bab0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1bac0 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1bad0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1bae0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1baf0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1bb00 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1bb10 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1bb20 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1bb30 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1bb40 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1bb50 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1bb60 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1bb70 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1bb80 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1bb90 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1bba0 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1bbb0 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1bbc0 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1bbd0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1bbe0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1bbf0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1bc00 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bc10 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bc20 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1bc30 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bc40 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bc50 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bc60 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bc70 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bc80 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bc90 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bca0 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bcb0 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bcc0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bcd0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bce0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bcf0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bd00 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bd10 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bd20 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bd30 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bd40 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bd50 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bd60 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bd70 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bd80 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bd90 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bda0 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bdb0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bdc0 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bdd0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bde0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1bdf0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1be00 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1be10 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1be20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1be30 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1be40 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1be50 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1be60 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1be70 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1be80 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1be90 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1bea0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1beb0 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1bec0 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1bed0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1bee0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1bef0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1bf00 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1bf10 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1bf20 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1bf30 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1bf40 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1bf50 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1bf60 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1bf70 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1bf80 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1bf90 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1bfa0 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1bfb0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1bfc0 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1bfd0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1bfe0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1bff0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1c000 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1c010 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1c020 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1c030 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1c040 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1c050 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1c060 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1c070 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1c080 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1c090 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1c0a0 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1c0b0 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1c0c0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1c0d0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1c0e0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c0f0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1c100 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1c110 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1c120 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1c130 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1c140 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c150 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c160 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c170 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c180 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c190 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c1a0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c1b0 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c1c0 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c1d0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c1e0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c1f0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c200 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c210 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c220 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c230 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c240 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c250 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c260 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c270 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c280 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c290 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c2a0 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c2b0 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c2c0 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c2d0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c2e0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c2f0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c310 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c320 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c330 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c340 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c350 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c360 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c370 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c380 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c390 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c3a0 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c3c0 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c3d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c3e0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c400 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c410 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c420 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c430 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c440 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c450 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c460 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c470 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c480 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c490 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c4a0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c4b0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c4c0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c4d0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c4e0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c4f0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c500 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c510 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c520 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c530 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c540 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c550 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c560 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c570 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c580 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c590 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c5a0 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c5b0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
1c5c0 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69   u32 savedPageSi
1c5d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
1c5e0 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  eSize;..  /* Fig
1c5f0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1c600 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1c610 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1c620 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1c630 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1c640 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1c650 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c660 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1c670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c680 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1c690 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1c6a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c6b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1c6c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1c6d0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1c6e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1c6f0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c700 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1c710 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1c720 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c730 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1c740 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1c750 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1c760 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1c770 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c780 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1c790 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c7a0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1c7b0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1c7c0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1c7d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1c7e0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1c7f0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1c800 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1c810 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1c820 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1c830 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1c840 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1c850 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1c860 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1c870 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c880 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1c890 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e  .c,.  ** mxPathn
1c8a0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1c8b0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1c8c0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1c8d0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1c8e0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1c8f0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1c900 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c910 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1c920 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c930 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c940 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c950 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c960 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c970 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c980 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1c990 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1c9a0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1c9b0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c9c0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1c9d0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1c9e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c9f0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1ca00 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ca10 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1ca20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1ca30 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1ca40 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1ca50 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1ca60 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1ca70 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1ca80 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1ca90 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1caa0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1cab0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cac0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1cad0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1cae0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1caf0 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1cb00 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1cb10 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1cb20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1cb30 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1cb40 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1cb50 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1cb60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1cb70 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1cb80 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1cb90 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1cba0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1cbb0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1cbc0 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1cbd0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1cbe0 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1cbf0 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1cc00 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1cc10 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1cc20 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1cc30 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1cc40 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1cc50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cc60 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1cc70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1cc80 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1cc90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cca0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1ccb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ccc0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1ccd0 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1cce0 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1ccf0 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1cd00 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1cd10 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1cd20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1cd30 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1cd40 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1cd50 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1cd60 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1cd70 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1cd80 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1cd90 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1cda0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1cdb0 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1cdc0 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1cdd0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1cde0 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1cdf0 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1ce00 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ce10 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1ce20 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1ce30 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1ce40 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1ce50 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1ce60 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1ce70 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1ce80 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1ce90 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1cea0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1ceb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1cec0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1ced0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1cee0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1cef0 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1cf00 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1cf10 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1cf20 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1cf30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1cf40 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1cf50 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1cf60 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1cf70 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1cf80 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1cf90 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1cfa0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1cfb0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1cfc0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1cfd0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1cfe0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1cff0 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1d000 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1d010 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1d020 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1d030 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1d040 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1d050 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1d060 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1d070 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1d080 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1d090 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1d0a0 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1d0b0 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1d0c0 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1d0d0 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1d0e0 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1d0f0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1d100 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1d110 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1d120 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1d130 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1d140 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1d150 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1d160 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1d170 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1d180 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1d190 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1d1a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1d1b0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1d1c0 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1d1d0 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1d1e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d1f0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1d200 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1d210 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1d220 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1d230 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1d240 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1d250 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1d260 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1d270 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1d280 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1d290 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1d2a0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1d2b0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1d2c0 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1d2d0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1d2e0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1d2f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1d300 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1d310 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d330 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1d340 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1d350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d370 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d380 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d390 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d3a0 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1d3b0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1d3c0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1d3d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1d3e0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1d3f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d400 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1d410 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1d420 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1d430 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1d440 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1d450 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1d460 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d470 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1d480 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1d490 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1d4a0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d4b0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1d4c0 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1d4d0 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1d4e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d500 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1d510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d520 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d530 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1d540 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d550 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1d560 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d570 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d580 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d590 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d5b0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1d5c0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1d5d0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1d5e0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1d5f0 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1d600 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1d610 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1d620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d630 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1d640 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1d650 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1d660 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1d670 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1d680 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1d690 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1d6a0 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1d6b0 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1d6c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1d6d0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1d6e0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1d6f0 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1d700 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1d710 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d720 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1d730 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d740 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d750 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d760 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1d770 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1d780 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1d790 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1d7a0 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1d7b0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1d7c0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1d7d0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1d7e0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1d7f0 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1d800 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1d810 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1d820 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1d830 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1d840 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1d850 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1d860 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1d870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d880 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d890 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1d8a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d8b0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1d8c0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1d8d0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1d8e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d8f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d900 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1d910 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1d920 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d  savedPageSize, -
1d930 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c  1);.  }.  /* Fol
1d940 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1d950 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1d960 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1d970 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1d980 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1d990 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1d9a0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1d9b0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1d9c0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1d9d0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d9e0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1d9f0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1da00 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1da10 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1da20 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1da30 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1da40 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1da50 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
1da60 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1da70 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1da80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1da90 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65 6e  NCHANGED,0);.#en
1daa0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
1dab0 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1dac0 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1dad0 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1dae0 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1daf0 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1db00 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1db10 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1db20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1db30 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1db40 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1db50 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1db60 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1db70 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1db80 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1db90 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1dba0 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1dbb0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1dbc0 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1dbd0 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1dbe0 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1dbf0 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1dc00 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1dc10 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1dc20 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1dc30 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1dc40 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1dc50 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1dc60 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1dc70 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1dc80 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1dc90 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1dca0 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1dcb0 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1dcc0 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1dcd0 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1dce0 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1dcf0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1dd00 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1dd10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1dd20 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1dd30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1dd40 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1dd50 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1dd60 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1dd70 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1dd80 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1dd90 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1dda0 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1ddb0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1ddc0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1ddd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
1dde0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1ddf0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1de00 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1de10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1de20 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20  ER_OPEN).  ){.  
1de30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de40 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20  gerSync(pPager, 
1de50 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1de60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1de70 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1de80 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1de90 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1dea0 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20  !='\0', 0);.    
1deb0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1dec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1ded0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dee0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1def0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1df00 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1df10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1df20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1df30 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1df40 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1df50 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1df60 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1df70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1df80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1df90 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1dfa0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1dfb0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dfc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dfd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f  ;.  }.  if( isHo
1dfe0 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29  t && nPlayback )
1dff0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1e000 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  g(SQLITE_NOTICE_
1e010 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
1e020 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20  , "recovered %d 
1e030 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a  pages from %s",.
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e050 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65  nPlayback, pPage
1e060 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
1e070 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1e080 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1e090 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1e0a0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1e0b0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1e0c0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1e0d0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1e0e0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1e0f0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1e100 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1e110 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1e120 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1e130 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1e140 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1e150 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1e160 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1e170 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1e180 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1e190 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1e1a0 73 65 20 66 69 6c 65 20 28 6f 72 20 6f 75 74 20  se file (or out 
1e1b0 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69 66  of.** the WAL if
1e1c0 20 74 68 61 74 20 69 73 20 77 68 65 72 65 20 74   that is where t
1e1d0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
1e1e0 6f 70 79 20 69 66 20 66 6f 75 6e 64 29 20 69 6e  opy if found) in
1e1f0 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1e200 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1e210 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1e220 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1e230 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1e240 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1e250 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1e260 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1e270 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1e280 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1e290 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1e2a0 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1e2b0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1e2c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e2d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1e2e0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1e2f0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1e300 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1e310 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1e320 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1e330 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e340 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e350 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1e360 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1e370 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1e380 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1e390 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1e3a0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1e3b0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e3c0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1e3d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e3e0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1e3f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75  ITE_OMIT_WAL.  u
1e400 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
1e410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1e420 72 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e 74  rame of WAL cont
1e430 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a  aining pgno */..
1e440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e450 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1e460 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1e470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1e480 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1e490 20 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72   );..  if( pager
1e4a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e4b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e4c0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
1e4d0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67  Pager->pWal, pPg
1e4e0 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  ->pgno, &iFrame)
1e4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e500 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1e510 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1e520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e530 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65  lReadFrame(pPage
1e540 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c  r->pWal, iFrame,
1e550 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e560 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20  ,pPg->pData);.  
1e570 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1e580 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1e590 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29   = (pPg->pgno-1)
1e5a0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1e5b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1e5c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1e5d0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1e5e0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1e5f0 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
1e600 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e610 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1e620 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1e630 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e640 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e650 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b   pPg->pgno==1 ){
1e660 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e670 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1e680 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1e690 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1e6a0 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1e6b0 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1e6c0 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1e6d0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1e6e0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1e6f0 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1e700 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1e710 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1e720 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1e730 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1e740 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1e750 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1e760 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e770 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1e780 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1e790 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1e7a0 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1e7b0 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1e7c0 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1e7d0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1e7e0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1e7f0 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1e800 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1e810 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1e820 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e830 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1e840 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1e850 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1e860 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1e870 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1e880 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1e890 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1e8a0 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1e8b0 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1e8c0 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1e8d0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1e8e0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1e8f0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1e900 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1e910 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1e920 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e930 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1e940 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1e950 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e960 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e980 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1e990 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1e9a0 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1e9b0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1e9c0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1e9d0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1e9e0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e9f0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1ea00 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1ea10 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
1ea20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1ea30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
1ea40 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1ea50 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1ea60 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1ea70 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1ea80 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1ea90 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1eaa0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1eab0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  ->pgno));.  PAGE
1eac0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1ead0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1eae0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1eaf0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1eb00 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1eb10 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1eb20 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1eb30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1eb40 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1eb50 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1eb60 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1eb70 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1eb80 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1eb90 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1eba0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1ebb0 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1ebc0 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1ebd0 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1ebe0 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1ebf0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1ec00 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1ec10 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1ec20 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1ec30 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1ec40 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1ec50 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1ec60 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1ec70 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1ec80 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1ec90 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1eca0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1ecb0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1ecc0 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1ecd0 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1ece0 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1ecf0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1ed00 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1ed10 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1ed20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1ed30 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1ed40 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1ed50 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1ed60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1ed70 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1ed80 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ed90 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1eda0 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1edb0 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1edc0 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1edd0 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1ede0 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1edf0 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1ee00 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1ee10 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1ee20 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1ee30 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1ee40 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1ee50 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1ee60 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1ee70 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1ee80 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1ee90 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1eea0 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1eeb0 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1eec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1eed0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1eee0 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1eef0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1ef00 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1ef10 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1ef20 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1ef30 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1ef40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ef50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1ef60 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1ef70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ef80 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1ef90 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1efa0 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1efb0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1efc0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1efd0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1efe0 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1eff0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1f000 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1f010 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1f020 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1f030 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1f040 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1f050 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1f060 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1f070 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1f080 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1f090 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f0a0 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1f0b0 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1f0c0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1f0d0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1f0e0 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1f0f0 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1f100 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1f110 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1f120 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1f130 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1f140 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1f150 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1f160 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f170 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f180 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1f190 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1f1a0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1f1b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f1c0 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1f1d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f1e0 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1f1f0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1f200 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1f210 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1f220 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1f230 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1f240 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1f250 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1f260 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1f270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f290 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1f2a0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1f2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f2c0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1f2d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1f2e0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1f2f0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1f300 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1f310 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1f320 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1f330 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1f340 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1f350 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1f360 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1f370 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1f380 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1f390 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1f3a0 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1f3b0 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1f3c0 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1f3d0 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1f3e0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1f3f0 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1f400 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1f410 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1f420 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1f430 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1f440 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1f450 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1f460 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1f470 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1f480 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1f490 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1f4a0 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1f4b0 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1f4c0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1f4d0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1f4e0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1f4f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f510 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1f520 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1f530 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1f540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f550 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1f560 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f570 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1f5a0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1f5b0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1f5c0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1f5d0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1f5e0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1f5f0 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1f600 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1f610 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1f620 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1f630 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1f640 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1f650 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1f660 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1f670 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1f680 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1f690 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1f6a0 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1f6b0 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1f6c0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1f6d0 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1f6e0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1f6f0 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1f700 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1f710 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1f720 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1f730 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f740 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1f750 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1f760 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1f770 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1f780 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1f790 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1f7a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1f7b0 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1f7c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f7d0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1f7e0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1f7f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1f800 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1f810 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1f820 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1f830 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1f840 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f850 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f860 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1f870 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1f880 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1f890 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1f8a0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1f8b0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1f8c0 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1f8d0 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1f8e0 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1f8f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1f900 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1f910 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1f920 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1f930 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1f940 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1f950 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1f960 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1f970 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1f980 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1f990 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1f9a0 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1f9b0 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1f9c0 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1f9d0 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1f9e0 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1f9f0 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1fa00 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1fa10 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1fa20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1fa30 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1fa40 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1fa50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1fa60 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1fa70 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1fa80 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1fa90 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1faa0 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1fab0 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1fac0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fae0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1faf0 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1fb00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fb30 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1fb40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fb60 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1fb70 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1fb80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb90 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1fba0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1fbb0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1fbc0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1fbd0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1fbe0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1fbf0 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1fc00 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1fc10 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1fc20 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1fc30 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1fc40 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1fc50 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fc60 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1fc70 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1fc80 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1fc90 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1fca0 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1fcb0 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1fcc0 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1fcd0 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1fce0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1fcf0 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1fd00 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1fd10 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1fd20 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1fd30 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1fd40 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1fd50 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1fd60 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1fd70 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1fd80 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1fd90 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1fda0 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1fdb0 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1fdc0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1fdd0 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1fde0 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1fdf0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1fe00 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1fe10 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1fe20 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1fe30 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1fe40 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1fe50 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1fe60 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1fe70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fe80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1fe90 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1fea0 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1feb0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1fec0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1fed0 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1fee0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1fef0 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1ff00 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ff10 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1ff20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1ff30 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1ff40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1ff50 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1ff60 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1ff70 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1ff80 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1ff90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ffa0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1ffb0 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1ffc0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ffd0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1ffe0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1fff0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
20000 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
20010 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
20020 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
20030 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
20040 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
20050 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
20060 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
20070 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
20080 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
20090 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
200a0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
200b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
200c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
200d0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
200e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
200f0 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
20100 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
20110 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
20120 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
20130 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
20140 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
20150 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
20160 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
20170 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
20180 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
20190 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
201a0 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
201b0 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
201c0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
201d0 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
201e0 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
201f0 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
20200 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
20210 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
20220 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
20230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20240 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20260 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20270 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
20280 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
20290 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
202a0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
202b0 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
202c0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
202d0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
202e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
202f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
20300 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
20310 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
20320 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
20330 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
20340 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
20350 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
20360 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
20370 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
20380 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
20390 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
203a0 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
203b0 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
203c0 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
203d0 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
203e0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
203f0 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
20400 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
20410 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
20420 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20430 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
20440 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
20450 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
20460 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
20470 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
20480 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
20490 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
204a0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
204b0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
204c0 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
204d0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
204e0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
204f0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
20500 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20510 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20520 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
20530 4d 4f 44 45 5f 57 41 4c 0a 20 20 20 20 20 20 20  MODE_WAL.       
20540 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
20550 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
20560 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32  JOURNALMODE_WAL2
20570 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 50 61 67  .    );.    pPag
20580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
20590 3d 20 73 71 6c 69 74 65 33 57 61 6c 4a 6f 75 72  = sqlite3WalJour
205a0 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  nalMode(pPager->
205b0 70 57 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pWal);.  }..  re
205c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
205d0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
205e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
205f0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
20600 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
20610 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
20620 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
20630 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
20640 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20650 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
20660 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
20670 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
20680 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
20690 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
206a0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
206b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
206c0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
206d0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
206e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
206f0 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
20700 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
20710 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
20720 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
20730 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
20740 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
20750 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
20760 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
20770 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
20780 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
20790 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
207a0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
207b0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
207c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
207d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
207e0 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
207f0 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
20800 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
20810 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
20820 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
20830 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
20840 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
20850 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
20860 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
20870 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
20880 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
20890 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
208a0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
208b0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
208c0 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
208d0 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
208e0 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
208f0 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
20900 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
20910 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
20920 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
20930 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
20940 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
20950 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20960 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20970 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20980 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20990 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
209a0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
209b0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
209c0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
209d0 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65  le==0 );.  nPage
209e0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
209f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
20a00 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20a10 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20a20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20a30 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
20a40 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57   from the.  ** W
20a50 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64  AL sub-system, d
20a60 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67  etermine the pag
20a70 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e  e count based on
20a80 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
20a90 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20aa0 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
20ab0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20ac0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
20ad0 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
20ae0 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
20af0 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
20b00 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
20b10 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
20b20 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
20b30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
20b40 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
20b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20b60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20b70 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
20b80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20b90 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
20ba0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
20bb0 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
20bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20bd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20be0 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20bf0 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20c00 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20c10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20c20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
20c30 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
20c40 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20c50 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
20c60 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
20c70 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
20c80 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20c90 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20ca0 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20cb0 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20cc0 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20cd0 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20ce0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20cf0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20d00 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20d10 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20d20 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
20d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20d40 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20d50 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
20d60 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
20d70 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
20d80 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20d90 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20da0 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20db0 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20dc0 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20dd0 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20de0 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20df0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20e00 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20e10 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20e20 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
20e30 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
20e40 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20e50 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20e60 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20e70 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20e80 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20e90 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20ea0 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20eb0 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20ec0 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20ed0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20ee0 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20ef0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20f00 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20f10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20f20 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20f30 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20f40 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20f50 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20f60 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20f70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20f80 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20f90 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20fa0 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20fb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20fc0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20fd0 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20fe0 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20ff0 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
21000 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
21010 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
21020 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
21030 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
21040 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
21050 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
21060 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
21070 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
21080 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
21090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
210a0 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
210b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
210c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
210d0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
210e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
210f0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
21100 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21110 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
21120 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
21130 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
21140 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
21150 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
21160 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
21170 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
21180 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
21190 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
211a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
211b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
211c0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
211d0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
211e0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
211f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
21200 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
21210 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  {.        Pgno n
21220 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
21230 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21240 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21250 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  file */..       
21260 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
21270 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
21280 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
21290 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
212a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  ;.        if( nP
212b0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
212c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
212d0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
212e0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
212f0 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Wal, 0);.       
21300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21310 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
21320 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
21330 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
21340 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
21350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21360 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
21370 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
21380 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21390 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
213a0 75 72 6e 61 6c 4d 6f 64 65 3e 3d 50 41 47 45 52  urnalMode>=PAGER
213b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
213c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
213d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
213e0 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
213f0 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
21400 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21410 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
21420 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
21430 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
21440 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
21450 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
21460 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
21470 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
21480 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21490 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
214a0 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
214b0 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
214c0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
214d0 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
214e0 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
214f0 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
21500 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
21510 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
21520 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
21530 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
21540 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
21550 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
21560 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
21570 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
21580 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
21590 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
215a0 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
215b0 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
215c0 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
215d0 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
215e0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
215f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21600 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
21610 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
21620 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21630 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21640 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
21650 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21660 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
21670 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21680 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
21690 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
216a0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
216b0 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
216c0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
216d0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
216e0 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
216f0 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
21700 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
21710 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
21720 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
21730 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
21740 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
21750 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
21760 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
21770 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
21780 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
21790 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
217a0 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
217b0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
217c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
217d0 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
217e0 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
217f0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
21800 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
21810 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
21820 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
21830 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
21840 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
21850 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
21860 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
21870 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
21880 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
21890 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
218a0 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
218b0 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
218c0 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
218d0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
218e0 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
218f0 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
21900 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
21910 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
21920 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
21930 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
21940 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
21950 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
21960 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
21970 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
21980 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
21990 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
219a0 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
219b0 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
219c0 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
219d0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
219e0 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
219f0 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
21a00 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
21a10 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
21a20 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
21a30 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
21a40 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
21a50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21a60 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
21a70 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
21a80 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
21a90 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
21aa0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
21ab0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
21ac0 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
21ad0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21ae0 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
21af0 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
21b00 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
21b10 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
21b20 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
21b30 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
21b40 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
21b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21b60 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
21b70 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
21b80 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
21b90 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
21ba0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
21bb0 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
21bc0 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
21bd0 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
21be0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21bf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21c00 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
21c10 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
21c20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
21c30 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
21c40 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
21c50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21c60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
21c70 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
21c80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21c90 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
21ca0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
21cb0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
21cc0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
21cd0 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
21ce0 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
21cf0 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
21d00 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
21d10 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
21d20 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
21d30 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
21d40 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
21d50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21d60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
21d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21d80 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21d90 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21da0 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21db0 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
21dc0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
21dd0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
21de0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
21df0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
21e00 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
21e10 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
21e20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
21e30 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
21e40 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
21e50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
21e60 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
21e70 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21e80 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21e90 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21ea0 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
21ec0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21ed0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
21ee0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21ef0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
21f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
21f10 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
21f20 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
21f30 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
21f40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21f50 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
21f60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21f70 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
21f80 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
21f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21fa0 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
21fb0 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
21fc0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
21fd0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
21fe0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
21ff0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
22000 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
22010 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
22020 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
22030 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22040 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
22050 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
22060 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
22070 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
22080 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
22090 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
220a0 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
220b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
220c0 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
220d0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
220e0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
220f0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
22100 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
22110 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
22120 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
22130 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
22140 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
22150 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
22160 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
22170 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
22180 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
22190 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
221a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
221b0 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
221c0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
221d0 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
221e0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
221f0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
22200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
22210 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
22220 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
22230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22240 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22250 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
22260 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
22270 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
22280 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
22290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
222a0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
222b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
222c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
222d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
222e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
222f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22300 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
22310 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
22320 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
22330 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
22340 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
22350 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
22360 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
22370 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
22380 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
22390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
223a0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
223b0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
223c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
223d0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
223e0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
223f0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
22400 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
22410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22420 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22430 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
22440 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
22450 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22460 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
22470 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
22480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
22490 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
224a0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
224b0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
224c0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
224d0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
224e0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
224f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22500 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
22510 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
22520 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
22530 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
22540 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
22550 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
22560 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
22570 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
22580 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
22590 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
225a0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
225b0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
225c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
225d0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
225e0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
225f0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
22600 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
22610 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
22620 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
22630 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
22640 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
22650 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
22660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
22670 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
22680 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
22690 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
226a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
226b0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
226c0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
226d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
226e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
226f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22700 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
22710 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
22720 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
22730 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22740 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
22750 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22760 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
22770 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
22780 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
22790 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
227a0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
227b0 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
227c0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
227d0 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
227e0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
227f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
22800 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
22810 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
22820 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
22830 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
22840 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
22850 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
22860 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
22870 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
22880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
22890 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
228a0 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
228b0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
228c0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
228d0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
228e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
228f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22900 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
22910 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
22920 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
22930 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
22940 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
22950 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
22960 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22970 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
22980 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
22990 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
229a0 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
229b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
229c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
229d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
229e0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
229f0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
22a00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22a10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22a20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
22a30 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
22a40 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
22a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22a60 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
22a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
22a80 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
22a90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22aa0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22ab0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22ac0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22ad0 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22ae0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22af0 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65  g to recycle cle
22b00 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61  an and unused pa
22b10 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
22b20 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
22b30 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
22b40 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
22b50 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22b60 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
22b70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22b80 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22b90 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22ba0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22bb0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22bc0 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22bd0 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22be0 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67  ing to spill pag
22bf0 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  es to journal..*
22c00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22c10 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50  erSetSpillsize(P
22c20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22c30 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
22c40 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
22c50 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50  eSetSpillsize(pP
22c60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
22c70 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
22c80 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
22c90 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
22ca0 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
22cb0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
22cc0 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
22cd0 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
22ce0 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22cf0 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
22d00 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22d10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22d20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
22d30 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
22d40 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
22d50 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
22d60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22d70 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
22d80 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
22d90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
22da0 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
22db0 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
22dc0 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
22dd0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22de0 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22df0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22e00 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22e10 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22e20 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22e30 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
22e40 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
22e50 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
22e60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22e70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22e80 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
22e90 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22ea0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22eb0 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22ec0 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22ed0 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22ee0 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22f00 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22f10 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22f20 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
22f40 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
22f50 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
22f60 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
22f70 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
22f80 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
22f90 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22fa0 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22fb0 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22fc0 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22fd0 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22fe0 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
22ff0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
23000 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
23010 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
23020 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
23030 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
23040 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
23050 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
23060 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
23070 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
23080 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
23090 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
230a0 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76  ere are four lev
230b0 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
230c0 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
230d0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
230e0 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
230f0 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
23110 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
23120 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
23130 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
23140 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
23150 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
23160 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
23170 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
23180 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
23190 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
231a0 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
231b0 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
231c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
231d0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
231e0 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
231f0 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
23200 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
23210 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
23220 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
23230 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
23240 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
23250 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
23260 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
23270 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
23280 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
23290 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
232a0 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
232b0 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
232c0 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
232d0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
232e0 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
232f0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
23300 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
23310 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
23320 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
23330 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
23340 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
23360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
23370 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
23380 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
23390 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
233a0 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
233b0 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
233c0 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
233e0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
233f0 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
23400 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
23410 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
23420 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
23430 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
23440 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
23450 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
23460 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
23470 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
23480 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
23490 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
234a0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52  k..**.**    EXTR
234b0 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69  A     This is li
234c0 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74  ke FULL except t
234d0 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63  hat is also sync
234e0 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  s the directory.
234f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23500 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
23510 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
23520 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  al after the rol
23530 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20  lback.**        
23540 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73        journal is
23550 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a   unlinked..**.**
23560 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
23570 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
23580 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
23590 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
235a0 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
235b0 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
235c0 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
235d0 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
235e0 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
235f0 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
23600 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
23610 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
23620 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23630 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
23640 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
23650 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
23660 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
23670 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
23680 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
23690 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
236a0 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
236b0 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
236c0 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
236d0 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
236e0 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
236f0 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
23700 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23710 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
23720 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
23730 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
23740 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
23750 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
23760 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
23770 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72  th NORMAL.  Ther
23780 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
23790 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a  ce between FULL.
237a0 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72  ** and EXTRA for
237b0 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
237c0 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
237d0 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
237e0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
237f0 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
23800 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23810 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
23820 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
23830 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
23840 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
23850 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
23860 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23870 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
23880 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
23890 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
238a0 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
238b0 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
238c0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
238d0 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
238e0 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
238f0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
23900 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
23910 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
23920 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
23930 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
23940 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
23950 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
23960 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
23970 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
23980 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
23990 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
239a0 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
239b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
239c0 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
239d0 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
239e0 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
239f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23a00 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
23a10 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
23a20 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
23a30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23a40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
23a50 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
23a60 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
23a70 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
23a80 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
23a90 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
23aa0 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
23ab0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23ac0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
23ad0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23ae0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
23af0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
23b00 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
23b10 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
23b20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
23b30 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
23b40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
23b50 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
23b60 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
23b70 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
23b80 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23b90 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
23ba0 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
23bb0 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
23bc0 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
23bd0 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23be0 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
23bf0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
23c00 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23c10 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23c20 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
23c30 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
23c40 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
23c50 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23c60 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23c70 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
23c80 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23c90 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23ca0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
23cc0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28  walSyncFlags = (
23cd0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23ce0 73 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61  s<<2);.  if( pPa
23cf0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
23d00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23d10 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61  SyncFlags |= pPa
23d20 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
23d30 20 20 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61    }.  if( (pgFla
23d40 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f  gs & PAGER_CKPT_
23d50 46 55 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70  FULLFSYNC) && !p
23d60 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
23d70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23d80 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51  SyncFlags |= (SQ
23d90 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c  LITE_SYNC_FULL<<
23da0 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  2);.  }.  if( pg
23db0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
23dc0 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
23dd0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23de0 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
23df0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
23e00 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23e10 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
23e20 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
23e30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
23e40 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
23e50 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
23e60 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
23e70 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
23e80 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
23e90 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23ea0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
23eb0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23ec0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
23ed0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
23ee0 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
23ef0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
23f00 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
23f10 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
23f20 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
23f30 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
23f40 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
23f50 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
23f60 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
23f70 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23f80 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
23f90 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
23fa0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
23fb0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
23fc0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
23fd0 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
23fe0 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
23ff0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
24000 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
24010 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
24020 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
24030 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
24040 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
24050 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
24060 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
24070 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
24080 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
24090 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
240a0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
240b0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
240c0 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
240d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
240e0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
240f0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
24100 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
24110 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
24120 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
24130 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
24140 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
24150 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
24160 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
24170 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
24180 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
24190 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
241a0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
241b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
241c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
241d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
241e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
241f0 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
24200 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
24210 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
24220 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
24230 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
24240 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
24250 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
24260 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
24270 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
24280 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
24290 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
242a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
242b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
242c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
242d0 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
242e0 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
242f0 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
24300 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
24310 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
24320 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
24330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
24340 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
24350 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
24360 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
24370 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
24380 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
24390 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
243a0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
243b0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
243c0 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
243d0 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
243e0 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
243f0 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
24400 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
24410 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
24420 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
24430 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
24440 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
24450 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
24460 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
24470 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
24480 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
24490 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
244a0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
244b0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
244c0 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
244d0 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
244e0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
244f0 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
24500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24510 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
24520 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
24530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24560 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
24570 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
24580 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
24590 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
245a0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
245b0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
245c0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
245d0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
245e0 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
245f0 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
24600 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24610 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
24620 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
24630 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
24640 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
24650 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
24660 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
24670 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
24680 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
24690 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
246a0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
246b0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
246c0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
246d0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
246e0 74 42 75 73 79 48 61 6e 64 6c 65 72 28 0a 20 20  tBusyHandler(.  
246f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24710 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
24720 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
24730 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
24740 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
24750 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
24760 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
24770 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
24780 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
247a0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
247b0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
247c0 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 2a   */.){.  void **
247d0 61 70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  ap;.  pPager->xB
247e0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
247f0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
24800 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
24810 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
24820 6c 65 72 41 72 67 3b 0a 20 20 61 70 20 3d 20 28  lerArg;.  ap = (
24830 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d  void **)&pPager-
24840 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20  >xBusyHandler;. 
24850 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
24860 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
24870 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
24880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   );.  assert( ap
24890 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65  [1]==pBusyHandle
248a0 72 41 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65  rArg );.  sqlite
248b0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
248c0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
248d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59  QLITE_FCNTL_BUSY
248e0 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a  HANDLER, (void *
248f0 29 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  )ap);.}../*.** C
24900 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
24910 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
24920 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
24930 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
24940 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
24950 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24960 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24970 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
24980 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
24990 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
249a0 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
249b0 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
249c0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
249d0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
249e0 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
249f0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
24a00 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
24a10 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
24a20 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
24a30 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
24a40 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
24a50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
24a60 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
24a70 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
24a80 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
24a90 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
24aa0 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
24ab0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
24ac0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
24ad0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
24ae0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
24af0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
24b00 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
24b10 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24b20 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
24b30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
24b40 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
24b50 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
24b60 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
24b70 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
24b80 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
24b90 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
24ba0 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
24bb0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
24bc0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
24bd0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
24be0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24bf0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24c00 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
24c10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
24c20 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
24c30 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
24c40 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
24c50 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
24c60 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
24c70 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24c80 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
24c90 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
24ca0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
24cb0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
24cc0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
24cd0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24ce0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24d00 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24d10 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
24d20 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
24d30 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
24d40 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
24d50 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
24d60 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24d70 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
24d80 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
24d90 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
24da0 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
24db0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
24dc0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
24dd0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24de0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24df0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24e00 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24e10 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24e20 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24e30 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24e40 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24e50 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24e60 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24e80 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
24e90 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
24ea0 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
24eb0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
24ec0 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
24ed0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24ee0 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24ef0 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24f00 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24f10 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24f20 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24f30 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24f40 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24f50 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24f60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24f70 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
24f80 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
24f90 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
24fa0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
24fb0 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
24fc0 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
24fd0 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24fe0 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24ff0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
25000 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
25010 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
25020 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
25030 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
25040 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
25050 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
25060 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
25070 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
25080 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
25090 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
250a0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
250b0 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
250c0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
250d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
250e0 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
250f0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
25100 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
25110 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
25120 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
25130 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
25140 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
25150 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
25160 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
25170 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
25180 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
25190 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
251a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
251b0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
251c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
251d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
251e0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
251f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
25200 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
25210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25220 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 38 20 62   ){.      /* 8 b
25230 79 74 65 73 20 6f 66 20 7a 65 72 6f 65 64 20 6f  ytes of zeroed o
25240 76 65 72 72 75 6e 20 73 70 61 63 65 20 69 73 20  verrun space is 
25250 73 75 66 66 69 63 69 65 6e 74 20 73 6f 20 74 68  sufficient so th
25260 61 74 20 74 68 65 20 62 2d 74 72 65 65 0a 20 20  at the b-tree.  
25270 20 20 20 20 2a 20 63 65 6c 6c 20 68 65 61 64 65      * cell heade
25280 72 20 70 61 72 73 65 72 20 77 69 6c 6c 20 6e 65  r parser will ne
25290 76 65 72 20 72 75 6e 20 6f 66 66 20 74 68 65 20  ver run off the 
252a0 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  end of the alloc
252b0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 70  ation */.      p
252c0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
252d0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
252e0 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
252f0 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
25300 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25310 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
25320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25330 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77       memset(pNew
25340 2b 70 61 67 65 53 69 7a 65 2c 20 30 2c 20 38 29  +pageSize, 0, 8)
25350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25360 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25380 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
25390 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
253a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
253b0 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d  PageSize(pPager-
253c0 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69  >pPCache, pageSi
253d0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
253e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
253f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25400 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
25410 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
25420 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
25430 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
25440 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
25450 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
25460 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
25470 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
25480 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
25490 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
254a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
254b0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 4e  lite3PageFree(pN
254c0 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ew);.    }.  }..
254d0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
254e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
254f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
25510 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
25520 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
25530 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
25540 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
25550 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
25560 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
25570 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
25580 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
25590 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
255a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
255b0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
255c0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
255d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
255e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
255f0 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72  r to the "tempor
25600 61 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72  ary page" buffer
25610 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79   held internally
25620 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72  .** by the pager
25630 2e 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66  .  This is a buf
25640 66 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20  fer that is big 
25650 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
25660 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e  he.** entire con
25670 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61  tent of a databa
25680 73 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62  se page.  This b
25690 75 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e  uffer is used in
256a0 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69  ternally.** duri
256b0 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  ng rollback and 
256c0 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
256d0 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72  ten whenever a r
256e0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
256f0 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f  s.  But other mo
25700 64 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74  dules are free t
25710 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73  o use it too, as
25720 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72   long as.** no r
25730 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70  ollbacks are hap
25740 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20  pening..*/.void 
25750 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d  *sqlite3PagerTem
25760 70 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50  pSpace(Pager *pP
25770 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25780 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
25790 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  e;.}../*.** Atte
257a0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d  mpt to set the m
257b0 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20  aximum database 
257c0 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78  page count if mx
257d0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
257e0 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  . .** Make no ch
257f0 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20  anges if mxPage 
25800 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  is zero or negat
25810 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20  ive.  And never 
25820 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61  reduce the.** ma
25830 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
25840 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65   below the curre
25850 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
25860 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52  atabase..**.** R
25870 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50  egardless of mxP
25880 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
25890 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20  current maximum 
258a0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
258b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
258c0 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65  axPageCount(Page
258d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
258e0 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78  xPage){.  if( mx
258f0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  Page>0 ){.    pP
25900 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d  ager->mxPgno = m
25910 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73  xPage;.  }.  ass
25920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25930 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate!=PAGER_OPEN 
25940 29 3b 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65  );      /* Calle
25950 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78  d only by OP_Max
25960 50 67 63 6e 74 20 2a 2f 0a 20 20 2f 2a 20 61 73  Pgcnt */.  /* as
25970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
25980 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
25990 53 69 7a 65 20 29 3b 20 2a 2f 0a 20 20 2f 2a 20  Size ); */.  /* 
259a0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 73 75  OP_MaxPgcnt ensu
259b0 72 65 73 20 74 68 61 74 20 74 68 65 20 70 61 72  res that the par
259c0 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74 6f  ameter passed to
259d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
259e0 73 20 6e 6f 74 0a 20 20 2a 2a 20 6c 65 73 73 20  s not.  ** less 
259f0 74 68 61 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  than the total n
25a00 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
25a10 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
25a20 62 61 73 65 2e 20 42 75 74 20 74 68 69 73 0a 20  base. But this. 
25a30 20 2a 2a 20 6d 61 79 20 62 65 20 6c 65 73 73 20   ** may be less 
25a40 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
25a50 65 2c 20 61 6e 64 20 73 6f 20 74 68 65 20 61 73  e, and so the as
25a60 73 65 72 74 28 29 20 61 62 6f 76 65 20 69 73 20  sert() above is 
25a70 6e 6f 74 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72  not valid */.  r
25a80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
25a90 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
25aa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
25ab0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
25ac0 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
25ad0 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
25ae0 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
25af0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
25b00 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
25b10 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
25b20 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
25b30 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
25b40 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
25b50 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
25b60 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
25b70 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
25b80 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
25b90 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
25ba0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
25bb0 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
25bc0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
25bd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
25be0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25bf0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
25c00 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
25c10 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
25c20 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
25c30 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
25c40 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25c50 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
25c60 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25c70 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
25c80 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25c90 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
25ca0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25cb0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25cc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
25cd0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
25ce0 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
25cf0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
25d00 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25d10 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
25d20 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
25d30 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
25d40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
25d50 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
25d60 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
25d70 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
25d80 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25d90 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25da0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25db0 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25dc0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25dd0 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25de0 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
25df0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
25e00 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
25e10 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25e20 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
25e30 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
25e40 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25e50 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
25e60 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
25e70 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
25e80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25e90 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25ea0 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25eb0 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25ec0 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25ed0 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25ee0 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
25ef0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
25f00 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
25f10 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
25f20 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
25f30 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
25f40 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
25f50 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
25f60 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25f70 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
25f80 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25f90 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25fa0 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25fc0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25fd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25fe0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
25ff0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
26000 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26010 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
26020 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
26030 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
26040 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
26050 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
26060 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
26070 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
26080 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
26090 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
260a0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
260b0 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
260c0 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
260d0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
260e0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
260f0 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
26100 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
26110 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
26120 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
26130 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
26140 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
26150 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
26160 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
26170 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
26180 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
26190 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
261a0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
261b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
261c0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
261d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
261e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
261f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26200 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
26210 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
26220 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
26230 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
26240 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
26250 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
26260 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
26270 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
26280 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
26290 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
262a0 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
262b0 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
262c0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
262d0 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
262e0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
262f0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
26300 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
26310 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
26320 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
26330 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
26340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
26350 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
26360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26370 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
26380 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
26390 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
263a0 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
263b0 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
263c0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
263d0 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
263e0 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
263f0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
26400 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
26410 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
26420 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
26430 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26440 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
26450 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
26460 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
26470 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
26480 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
26490 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
264a0 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
264b0 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
264c0 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
264d0 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
264e0 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
264f0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
26500 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
26510 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
26520 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
26530 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
26540 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
26550 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
26560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26570 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
26580 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
26590 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
265a0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
265b0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
265c0 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
265d0 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
265e0 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
265f0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
26600 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
26610 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
26620 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26630 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
26640 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
26650 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26670 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
26680 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
26690 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
266a0 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
266b0 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
266c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
266d0 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
266e0 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
266f0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
26700 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
26710 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
26720 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
26730 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
26740 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
26750 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
26760 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
26770 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
26780 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
26790 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
267a0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
267b0 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
267c0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
267d0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
267e0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
267f0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
26800 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
26810 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
26820 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
26830 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
26840 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
26850 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
26860 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
26870 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
26880 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
26890 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
268a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
268b0 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
268c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
268d0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
268e0 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
268f0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
26900 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
26910 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
26920 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
26930 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
26940 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
26950 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
26960 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
26970 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
26980 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
26990 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
269a0 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
269b0 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
269c0 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
269d0 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
269e0 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
269f0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
26a00 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
26a10 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
26a20 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
26a30 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
26a40 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
26a50 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
26a60 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
26a70 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
26a80 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
26a90 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
26aa0 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
26ab0 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
26ac0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
26ad0 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
26ae0 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
26af0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
26b00 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
26b10 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
26b20 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
26b30 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26b40 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
26b50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
26b60 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
26b70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
26b80 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
26b90 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
26ba0 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
26bb0 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
26bc0 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
26bd0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
26be0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
26bf0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
26c00 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
26c10 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
26c20 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
26c30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26c40 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
26c50 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
26c60 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
26c70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
26c80 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26c90 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
26ca0 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
26cb0 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
26cc0 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
26cd0 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
26ce0 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
26cf0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
26d00 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
26d10 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
26d20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
26d30 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
26d40 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26d50 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26d60 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26d70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
26d80 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26d90 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26da0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26db0 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26dc0 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26dd0 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26de0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26df0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
26e00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26e10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
26e20 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
26e30 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
26e40 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26e50 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
26e60 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
26e70 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26e80 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26e90 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26ea0 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26ec0 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26ed0 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26ee0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
26ef0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
26f00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26f10 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
26f20 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
26f30 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
26f40 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
26f50 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
26f60 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
26f70 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
26f80 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26f90 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26fa0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26fb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26fc0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26fd0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26fe0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
26ff0 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
27000 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
27010 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
27020 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
27030 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
27040 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
27050 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
27060 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
27070 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
27080 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
27090 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
270a0 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
270b0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
270c0 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
270d0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
270e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
270f0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
27100 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
27110 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
27120 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
27130 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
27140 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
27150 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
27160 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
27170 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
27180 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
27190 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
271a0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
271b0 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
271c0 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
271d0 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
271e0 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
271f0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
27200 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
27210 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
27220 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
27230 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
27240 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
27250 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
27260 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
27270 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
27280 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
27290 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
272a0 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
272b0 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
272c0 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
272d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
272e0 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
272f0 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
27300 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
27310 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
27320 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
27330 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
27340 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
27350 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
27360 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
27370 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
27380 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
27390 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
273a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
273b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
273c0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
273d0 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
273e0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
273f0 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
27400 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
27410 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
27420 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
27430 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
27440 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27450 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
27460 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
27470 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
27480 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
27490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
274a0 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
274b0 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
274c0 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
274d0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
274e0 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
274f0 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
27500 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
27510 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
27520 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27530 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
27540 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
27550 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
27560 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
27570 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
27580 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
27590 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
275a0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
275b0 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
275c0 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
275d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
275e0 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
275f0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27600 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
27610 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
27620 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
27630 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
27640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
27650 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27660 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
27670 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
27680 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
27690 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
276a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
276b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
276c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
276d0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
276e0 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
276f0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
27700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
27710 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
27720 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62  _SIZE>0./*.** Ob
27730 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
27740 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
27750 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
27760 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
27770 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
27780 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
27790 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
277a0 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
277b0 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
277c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
277d0 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
277e0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
277f0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
27800 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
27810 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
27820 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
27830 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
27840 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
27850 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
27860 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
27870 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
27880 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
27890 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
278a0 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
278b0 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
278c0 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
278d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
278e0 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
278f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
27900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27910 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
27920 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
27950 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
27960 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
27970 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
27980 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
27990 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
279a0 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
279b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279c0 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
279d0 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
279e0 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
27a10 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
27a20 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
27a30 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
27a40 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
27a50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
27a60 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27a70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
27a80 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
27a90 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
27aa0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61  Dirty = 0;.    a
27ab0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
27ac0 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20  Extra>=8 );.    
27ad0 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
27ae0 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 8);.  }else
27af0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
27b00 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
27b10 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
27b20 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
27b30 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
27b40 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
27b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
27b60 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
27b70 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
27b80 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
27b90 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
27ba0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27bb0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
27bc0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
27bd0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
27be0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
27bf0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
27c00 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
27c10 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
27c20 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
27c30 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
27c40 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27c50 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27c60 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27c70 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27c80 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27c90 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
27ca0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
27cb0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
27cc0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
27cd0 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
27ce0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
27cf0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
27d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27d10 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
27d20 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
27d30 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
27d40 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27d50 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27d60 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27d70 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27d80 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27d90 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27da0 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
27db0 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
27dc0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27dd0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27de0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
27df0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
27e00 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
27e10 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
27e20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27e30 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
27e40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27e50 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27e60 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27e70 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27e80 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27e90 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27ea0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27eb0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
27ec0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27ed0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27ee0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
27ef0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
27f00 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
27f10 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
27f20 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
27f30 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
27f40 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27f50 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27f60 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27f70 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27f80 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27f90 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27fa0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
27fb0 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
27fc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27fd0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
27fe0 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
27ff0 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
28000 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
28010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28020 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
28030 69 73 20 73 74 69 6c 6c 20 77 68 65 72 65 20 69  is still where i
28040 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65  t ought.** to be
28050 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72   on disk.  Retur
28060 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49  n non-zero (SQLI
28070 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
28080 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  VED or some othe
28090 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  r error.** code 
280a0 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63  from sqlite3OsAc
280b0 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64  cess()) if the d
280c0 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65  atabase has gone
280d0 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   missing..*/.sta
280e0 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
280f0 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20  IsUnmoved(Pager 
28100 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
28110 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20  bHasMoved = 0;. 
28120 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
28130 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
28140 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28150 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
28160 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72  r->dbSize==0 ) r
28170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28180 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28190 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  r->zFilename && 
281a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
281b0 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73  e[0] );.  rc = s
281c0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
281d0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
281e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53  SQLITE_FCNTL_HAS
281f0 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76  _MOVED, &bHasMov
28200 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ed);.  if( rc==S
28210 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
28220 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
28230 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63  HAS_MOVED file-c
28240 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c  ontrol is unimpl
28250 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20  emented, assume 
28260 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20  that the file.  
28270 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
28280 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69  n moved.  That i
28290 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c  s the historical
282a0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c   behavior of SQL
282b0 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20  ite: prior to.  
282c0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38    ** version 3.8
282d0 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65  .3, it never che
282e0 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d  cked */.    rc =
282f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
28300 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
28310 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76  TE_OK && bHasMov
28320 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
28330 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
28340 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65  BMOVED;.  }.  re
28350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
28360 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
28370 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
28380 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
28390 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
283a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
283b0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
283c0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
283d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
283e0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
283f0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
28400 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
28410 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
28420 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
28430 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
28440 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
28450 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
28460 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
28470 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
28480 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
28490 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
284a0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
284b0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
284c0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
284d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
284e0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
284f0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
28500 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
28510 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
28520 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
28530 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
28540 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
28550 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
28560 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
28570 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
28580 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
28590 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
285a0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
285b0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
285c0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
285d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73  Pager *pPager, s
285e0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 75  qlite3 *db){.  u
285f0 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29 70  8 *pTmp = (u8*)p
28600 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
28610 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 7c  ;.  assert( db |
28620 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
28630 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
28640 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
28650 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
28660 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
28670 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
28680 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
28690 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
286a0 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d 61  );.  pagerFreeMa
286b0 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a 20  pHdrs(pPager);. 
286c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 43   /* pPager->errC
286d0 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ode = 0; */.  pP
286e0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
286f0 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ode = 0;.#ifndef
28700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
28710 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  .  {.    u8 *a =
28720 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
28730 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57  db || pPager->pW
28740 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
28750 20 64 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66   db && 0==(db->f
28760 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f  lags & SQLITE_No
28770 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20  CkptOnClose) .  
28780 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d     && SQLITE_OK=
28790 3d 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76  =databaseIsUnmov
287a0 65 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  ed(pPager).    )
287b0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 54 6d 70  {.      a = pTmp
287c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
287d0 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
287e0 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50  er->pWal, db, pP
287f0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
28800 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
28810 53 69 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50 61  Size,a);.    pPa
28820 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20  ger->pWal = 0;. 
28830 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65   }.#endif.  page
28840 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
28850 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
28860 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
28870 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
28880 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20  e{.    /* If it 
28890 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68  is open, sync th
288a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
288b0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e  efore calling Un
288c0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e  lockAndRollback.
288d0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
288e0 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65  is not done, the
288f0 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f  n an unsynced po
28900 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65  rtion of the ope
28910 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a  n journal .    *
28920 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c  * file may be pl
28930 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
28940 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
28950 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
28960 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77  occurs .    ** w
28970 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70  hile this is hap
28980 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61  pening, the data
28990 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d  base could becom
289a0 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
289b0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65  *.    ** If an e
289c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
289d0 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63  e trying to sync
289e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68   the journal, sh
289f0 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ift the pager.  
28a00 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52    ** into the ER
28a10 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20  ROR state. This 
28a20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64  causes UnlockAnd
28a30 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f  Rollback to unlo
28a40 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  ck the.    ** da
28a50 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65  tabase and close
28a60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28a70 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70  e without attemp
28a80 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a  ting to roll it.
28a90 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66      ** back or f
28aa0 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20  inalize it. The 
28ab0 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73  next database us
28ac0 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20  er will have to 
28ad0 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20  do hot-journal. 
28ae0 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62     ** rollback b
28af0 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20  efore accessing 
28b00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28b10 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
28b20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
28b30 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70  >jfd) ){.      p
28b40 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
28b50 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  r, pagerSyncHotJ
28b60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b  ournal(pPager));
28b70 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
28b80 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
28b90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
28ba0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
28bb0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61  nMalloc();.  ena
28bc0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
28bd0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47  _errors();.  PAG
28be0 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  ERTRACE(("CLOSE 
28bf0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
28c00 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52  Pager)));.  IOTR
28c10 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
28c20 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71  ", pPager)).  sq
28c30 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
28c40 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c  ger->jfd);.  sql
28c50 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
28c60 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74  er->fd);.  sqlit
28c70 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29  e3PageFree(pTmp)
28c80 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
28c90 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
28ca0 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66  PCache);..#ifdef
28cb0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28cc0 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  C.  if( pPager->
28cd0 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61  xCodecFree ) pPa
28ce0 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28  ger->xCodecFree(
28cf0 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b  pPager->pCodec);
28d00 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
28d10 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76  t( !pPager->aSav
28d20 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65  epoint && !pPage
28d30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
28d40 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
28d50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28d60 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  && !isOpen(pPage
28d70 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73  r->sjfd) );..  s
28d80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
28d90 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
28da0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
28db0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
28dc0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
28dd0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
28de0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
28df0 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70  umber for page p
28e00 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  Pg..*/.Pgno sqli
28e10 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
28e20 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  er(DbPage *pPg){
28e30 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
28e40 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
28e50 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
28e60 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
28e70 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  nt for page pPg.
28e80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
28e90 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20  PagerRef(DbPage 
28ea0 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pPg){.  sqlite3
28eb0 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a  PcacheRef(pPg);.
28ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
28ed0 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74  e journal. In ot
28ee0 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
28ef0 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
28f00 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
28f10 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
28f30 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
28f40 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
28f50 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
28f60 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
28f70 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
28f80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
28f90 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
28fa0 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  f the Pager.noSy
28fb0 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nc flag is set, 
28fc0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
28fd0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
28fe0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  * Otherwise, the
28ff0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
29000 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
29010 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64  journal-mode and
29020 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20   the .** device 
29030 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
29040 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  of the file-syst
29050 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
29060 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
29070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
29080 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
29090 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
290a0 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
290b0 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
290c0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
290d0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
290e0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
290f0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
29100 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
29110 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
29120 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
29130 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
29140 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
29150 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
29160 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
29170 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
29180 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
29190 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
291a0 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
291b0 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
291c0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
291d0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
291e0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
291f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29200 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
29210 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
29220 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
29230 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
29240 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
29250 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
29260 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
29270 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
29280 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
29290 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
292a0 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
292b0 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
292c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
292d0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
292e0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
292f0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
29300 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
29310 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
29320 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
29330 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
29340 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
29350 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
29360 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
29370 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
29380 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
29390 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
293a0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
293b0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
293c0 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
293d0 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
293e0 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
293f0 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
29400 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
29410 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
29420 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
29430 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
29440 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29450 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
29460 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
29470 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
29480 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
29490 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
294a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
294d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
294e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
294f0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
29500 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
29510 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
29520 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
29530 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
29540 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
29550 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
29560 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
29570 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
29580 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
29590 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
295a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
295b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
295c0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
295d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
295e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
295f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29600 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
29610 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
29620 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
29630 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
29640 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
29650 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
29660 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
29670 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
29680 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
29690 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
296a0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
296b0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
296c0 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
296d0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
296e0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
296f0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
29700 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
29710 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
29720 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
29730 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
29740 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
29750 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
29760 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
29770 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
29780 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
29790 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
297a0 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
297b0 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
297c0 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
297d0 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
297e0 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
297f0 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
29800 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
29810 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
29820 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
29830 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
29840 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
29850 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
29860 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
29870 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
29880 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
29890 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
298a0 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
298b0 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
298c0 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
298d0 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
298e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
298f0 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
29900 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
29910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29920 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
29930 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
29940 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
29950 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
29960 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
29970 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
29980 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
29990 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
299a0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
299b0 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
299c0 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
299d0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
299e0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
299f0 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
29a00 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
29a10 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
29a20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
29a30 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
29a40 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
29a50 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
29a60 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29a70 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
29a80 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
29a90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
29aa0 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
29ab0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
29ac0 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
29ad0 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
29ae0 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
29af0 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
29b00 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
29b10 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
29b20 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
29b30 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
29b40 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
29b50 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
29b60 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
29b70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
29b80 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
29b90 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
29ba0 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
29bb0 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
29bc0 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
29bd0 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
29be0 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
29bf0 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
29c00 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
29c10 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
29c20 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
29c30 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
29c40 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
29c50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29c60 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
29c70 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
29c80 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
29c90 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
29ca0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
29cb0 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
29cc0 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
29cd0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
29ce0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
29cf0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
29d00 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
29d10 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
29d20 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
29d30 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
29d40 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
29d50 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
29d60 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
29d70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29d80 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
29d90 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
29da0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
29db0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29dc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
29dd0 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
29de0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
29df0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
29e00 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
29e10 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
29e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29e30 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
29e40 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
29e50 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
29e60 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
29e70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
29e80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
29e90 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
29ea0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
29eb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
29ec0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
29ed0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
29ee0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
29ef0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29f00 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
29f10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
29f20 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
29f30 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
29f40 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
29f50 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
29f60 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
29f70 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
29f80 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
29f90 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
29fa0 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
29fb0 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
29fc0 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
29fd0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
29fe0 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
29ff0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
2a000 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
2a010 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
2a020 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
2a030 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
2a040 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
2a050 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
2a060 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
2a070 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
2a080 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
2a090 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2a0a0 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
2a0b0 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
2a0c0 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
2a0d0 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
2a0e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
2a0f0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
2a100 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
2a110 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
2a120 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
2a130 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2a140 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2a150 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
2a160 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
2a170 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
2a180 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a190 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
2a1a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a1b0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
2a1c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
2a1d0 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2a1e0 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
2a1f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2a200 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
2a210 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
2a220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a240 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
2a260 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
2a270 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
2a280 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2a290 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
2a2a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2a2b0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
2a2c0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
2a2d0 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
2a2e0 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
2a2f0 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
2a300 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a310 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2a330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
2a340 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
2a350 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
2a360 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
2a370 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
2a380 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
2a390 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
2a3a0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
2a3b0 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
2a3c0 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
2a3d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2a3e0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
2a3f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2a400 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
2a410 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2a420 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
2a430 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
2a440 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
2a450 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2a460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2a480 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
2a490 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
2a4a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a4b0 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
2a4c0 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
2a4d0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
2a4e0 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
2a4f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
2a500 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
2a510 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
2a520 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
2a530 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a540 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a550 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2a560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
2a570 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2a580 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2a590 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
2a5a0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
2a5b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
2a5c0 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
2a5d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
2a5e0 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
2a5f0 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
2a600 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
2a610 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
2a620 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
2a630 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
2a640 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
2a650 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
2a660 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
2a670 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
2a680 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
2a690 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
2a6a0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2a6b0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2a6c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2a6d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2a6e0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
2a6f0 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
2a700 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
2a710 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
2a720 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
2a730 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
2a740 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2a750 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
2a760 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
2a770 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
2a780 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
2a790 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2a7a0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
2a7b0 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
2a7c0 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
2a7d0 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
2a7e0 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
2a7f0 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
2a800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
2a810 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
2a820 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
2a830 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
2a840 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
2a850 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
2a860 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
2a870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a880 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
2a890 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
2a8a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2a8b0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
2a8c0 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
2a8d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
2a8e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2a8f0 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
2a900 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
2a910 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
2a920 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2a930 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
2a940 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
2a950 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
2a960 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
2a970 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
2a980 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
2a990 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
2a9a0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
2a9b0 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
2a9c0 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
2a9d0 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
2a9e0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
2a9f0 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
2aa00 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
2aa10 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
2aa20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2aa30 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
2aa40 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
2aa50 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
2aa60 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
2aa70 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2aa80 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
2aa90 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
2aaa0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
2aab0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
2aac0 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
2aad0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2aae0 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
2aaf0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2ab00 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
2ab10 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
2ab20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2ab30 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
2ab40 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
2ab50 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
2ab60 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
2ab70 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
2ab80 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
2ab90 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
2aba0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
2abb0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
2abc0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
2abd0 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
2abe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2abf0 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
2ac00 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2ac10 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2ac20 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2ac30 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
2ac40 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
2ac50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ac60 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
2ac70 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
2ac80 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
2ac90 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
2aca0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
2acb0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2acc0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
2acd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
2ace0 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
2acf0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ad00 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2ad10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2ad20 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2ad30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
2ad40 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
2ad50 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
2ad60 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2ad70 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
2ad80 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
2ad90 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
2ada0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2adb0 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ile || pPager->e
2adc0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2add0 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61  TER_DBMOD );.  a
2ade0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2adf0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
2ae00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2ae10 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2ae20 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70  >fd) || pList->p
2ae30 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dirty==0 );..  /
2ae40 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
2ae50 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73   a temp-file has
2ae60 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2ae70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  ened, open it no
2ae80 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f  w. It.  ** is no
2ae90 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  t possible for r
2aea0 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68  c to be other th
2aeb0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  an SQLITE_OK if 
2aec0 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a  this branch.  **
2aed0 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61   is taken, as pa
2aee0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2aef0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
2af00 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20  r temp-files..  
2af10 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
2af20 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
2af30 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2af40 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2af50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2af60 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
2af70 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
2af80 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
2af90 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
2afa0 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20   }..  /* Before 
2afb0 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65 2c  the first write,
2afc0 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61 20   give the VFS a 
2afd0 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68 65  hint of what the
2afe0 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65   final.  ** file
2aff0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20   size will be.. 
2b000 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
2b010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
2b020 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2b030 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ) );.  if( rc==S
2b040 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20  QLITE_OK .   && 
2b050 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2b060 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
2b070 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d 3e  e.   && (pList->
2b080 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d  pDirty || pList-
2b090 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
2b0a0 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20  HintSize).  ){. 
2b0b0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
2b0c0 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72   szFile = pPager
2b0d0 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
2b0e0 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67  lite3_int64)pPag
2b0f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
2b100 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
2b110 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
2b120 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
2b130 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
2b140 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
2b150 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
2b160 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
2b170 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
2b180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2b190 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
2b1a0 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
2b1b0 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
2b1c0 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
2b1d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
2b1e0 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
2b1f0 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
2b200 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
2b210 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
2b220 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
2b230 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
2b240 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
2b250 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
2b260 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
2b270 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
2b280 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
2b290 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
2b2a0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
2b2b0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
2b2c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
2b2d0 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
2b2e0 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
2b2f0 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
2b300 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
2b310 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
2b320 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
2b330 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
2b340 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
2b350 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
2b360 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
2b370 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
2b380 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
2b390 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
2b3a0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
2b3b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
2b3c0 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
2b3d0 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
2b3e0 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2b410 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
2b420 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
2b430 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
2b440 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2b450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
2b460 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
2b470 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
2b480 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
2b490 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
2b4a0 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
2b4b0 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
2b4c0 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
2b4d0 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
2b4e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b4f0 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61  OMEM_BKPT, pData
2b500 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
2b510 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
2b520 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
2b530 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2b540 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
2b550 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
2b560 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
2b570 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
2b580 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
2b590 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
2b5a0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
2b5b0 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
2b5c0 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
2b5d0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
2b5e0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
2b5f0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
2b600 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
2b610 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
2b620 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
2b630 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
2b640 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b650 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
2b660 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2b670 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2b680 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
2b690 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
2b6a0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
2b6b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
2b6c0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
2b6d0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
2b6e0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
2b6f0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
2b700 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2b710 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
2b720 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20  AT_WRITE]++;..  
2b730 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
2b740 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
2b750 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
2b760 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
2b770 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
2b780 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
2b790 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
2b7a0 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
2b7b0 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
2b7c0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b7d0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
2b7e0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
2b7f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b800 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2b810 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
2b820 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2b830 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
2b840 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
2b850 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
2b860 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
2b870 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
2b880 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
2b890 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2b8a0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b8b0 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
2b8c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b8d0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
2b8e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
2b8f0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
2b900 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
2b910 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
2b920 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
2b940 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
2b950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b960 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
2b970 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
2b980 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
2b990 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2b9a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2b9b0 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
2b9c0 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
2b9d0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
2b9e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
2b9f0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
2ba00 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2ba10 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2ba20 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
2ba30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ba40 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
2ba50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2ba60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ba70 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
2ba80 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2ba90 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  d) ){.    const 
2baa0 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51 4c  int flags =  SQL
2bab0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2bac0 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL | SQLITE_OPE
2bad0 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20 20  N_READWRITE .   
2bae0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2baf0 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45  _CREATE | SQLITE
2bb00 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
2bb10 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f  .      | SQLITE_
2bb20 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
2bb30 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d  SE;.    int nStm
2bb40 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33  tSpill = sqlite3
2bb50 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c  Config.nStmtSpil
2bb60 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  l;.    if( pPage
2bb70 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2bb80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bb90 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67  E_MEMORY || pPag
2bba0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
2bbb0 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74 53   ){.      nStmtS
2bbc0 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  pill = -1;.    }
2bbd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2bbe0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  3JournalOpen(pPa
2bbf0 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50  ger->pVfs, 0, pP
2bc00 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67  ager->sjfd, flag
2bc10 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a  s, nStmtSpill);.
2bc20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
2bc40 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
2bc50 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
2bc60 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
2bc70 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
2bc80 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2bc90 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69 74  ful, set the bit
2bca0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
2bcb0 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74  o pPg->pgno in t
2bcc0 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f  he bitvecs.** fo
2bcd0 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  r all open savep
2bce0 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65 74  oints before ret
2bcf0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  urning..**.** Th
2bd00 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
2bd10 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  rns SQLITE_OK if
2bd20 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2bd30 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f  uccessful, an IO
2bd40 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
2bd50 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
2bd60 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73 75   write to the su
2bd70 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  b-journal fails,
2bd80 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   or .** SQLITE_N
2bd90 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
2bda0 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65 74   fails while set
2bdb0 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61 20  ting a bit in a 
2bdc0 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74  savepoint.** bit
2bdd0 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vec..*/.static i
2bde0 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  nt subjournalPag
2bdf0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2be00 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2be10 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
2be20 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
2be30 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  er;.  if( pPager
2be40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2be50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2be60 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  _OFF ){..    /* 
2be70 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  Open the sub-jou
2be80 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73 20  rnal, if it has 
2be90 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
2bea0 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61   opened */.    a
2beb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2bec0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
2bed0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2bee0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20  pPager->jfd) || 
2bef0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bf00 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  er) );.    asser
2bf10 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2bf20 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  ->sjfd) || pPage
2bf30 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b  r->nSubRec==0 );
2bf40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
2bf50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2bf60 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 61   .         || pa
2bf70 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67  geInJournal(pPag
2bf80 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20 20  er, pPg) .      
2bf90 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e     || pPg->pgno>
2bfa0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2bfb0 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ze .    );.    r
2bfc0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2bfd0 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  al(pPager);..   
2bfe0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a   /* If the sub-j
2bff0 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65  ournal was opene
2c000 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28  d successfully (
2c010 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f  or was already o
2c020 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69  pen),.    ** wri
2c030 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  te the journal r
2c040 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66  ecord into the f
2c050 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ile.  */.    if(
2c060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c070 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44  {.      void *pD
2c080 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
2c090 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  ;.      i64 offs
2c0a0 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72  et = (i64)pPager
2c0b0 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->nSubRec*(4+pPa
2c0c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
2c0d0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2c0e0 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  a2;..#if SQLITE_
2c0f0 48 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20 20  HAS_CODEC   .   
2c100 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2c110 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2c120 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
2c130 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2c140 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2c150 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2c160 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20  BKPT, pData2);. 
2c170 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
2c180 66 0a 20 20 20 20 20 20 70 44 61 74 61 32 20 3d  f.      pData2 =
2c190 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50 41   pData;.      PA
2c1a0 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2c1b0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2c1c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2c1d0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2c1e0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2c1f0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2c200 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2c210 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2c220 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2c250 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2c260 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2c270 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2c280 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2c290 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2c2a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c2b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2c2c0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2c2d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2c2e0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2c2f0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2c300 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2c310 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2c320 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c330 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2c340 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2c350 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2c360 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2c370 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2c380 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2c390 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2c3a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2c3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c3c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2c3d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2c3e0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2c3f0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2c400 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2c410 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2c420 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2c430 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2c440 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2c450 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2c460 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2c470 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2c480 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2c490 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2c4a0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2c4b0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2c4c0 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2c4d0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2c4e0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2c4f0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2c500 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2c510 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2c520 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2c530 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2c540 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2c550 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2c560 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2c570 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2c580 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2c590 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2c5a0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2c5b0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2c5c0 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2c5d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2c5e0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2c5f0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2c600 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2c610 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2c620 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2c630 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c640 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2c650 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2c660 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2c670 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2c680 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2c690 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c6a0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2c6b0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2c6c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2c6d0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2c6e0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2c6f0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2c700 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2c710 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2c720 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2c730 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2c740 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2c750 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2c760 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2c770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2c780 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2c790 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2c7a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2c7b0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2c7c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c7d0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2c7e0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2c7f0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2c800 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2c810 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2c820 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2c830 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2c840 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2c850 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2c860 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2c870 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2c880 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2c890 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2c8a0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2c8b0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2c8c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2c8d0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2c8e0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2c8f0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2c900 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2c910 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2c920 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2c930 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2c940 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2c950 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2c960 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2c970 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2c980 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2c990 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2c9a0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2c9b0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2c9c0 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2c9d0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2c9e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2c9f0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2ca00 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2ca10 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2ca20 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2ca30 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2ca40 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2ca50 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2ca60 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2ca70 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2ca80 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2ca90 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2caa0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2cab0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2cac0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2cad0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2cae0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2caf0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2cb00 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2cb10 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2cb20 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2cb30 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2cb40 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2cb50 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2cb60 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2cb70 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2cb80 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2cb90 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2cba0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2cbb0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2cbc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2cbd0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2cbe0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2cbf0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2cc00 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2cc10 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2cc20 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2cc30 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2cc40 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2cc50 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2cc60 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2cc70 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2cc80 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2cc90 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2cca0 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2ccb0 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2ccc0 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2ccd0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2cce0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2ccf0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2cd00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2cd10 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61 53   }..  pPager->aS
2cd20 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 53  tat[PAGER_STAT_S
2cd30 50 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e  PILL]++;.  pPg->
2cd40 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66  pDirty = 0;.  if
2cd50 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
2cd60 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ager) ){.    /* 
2cd70 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66  Write a single f
2cd80 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61  rame for this pa
2cd90 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a  ge to the log. *
2cda0 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  /.    rc = subjo
2cdb0 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69  urnalPageIfRequi
2cdc0 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69  red(pPg); .    i
2cdd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cde0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2cdf0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50  agerWalFrames(pP
2ce00 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29  ager, pPg, 0, 0)
2ce10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2ce20 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
2ce30 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
2ce40 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2ce50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
2ce60 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  mpFile==0 ){.   
2ce70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
2ce80 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
2ce90 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2cea0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ceb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67 65  OK ) return page
2cec0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2ced0 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rc);.    }.#endi
2cee0 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63  f.  .    /* Sync
2cef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cf00 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  e if required. *
2cf10 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66  /.    if( pPg->f
2cf20 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2cf30 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50  SYNC .     || pP
2cf40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2cf50 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
2cf60 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  MOD.    ){.     
2cf70 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2cf80 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  l(pPager, 1);.  
2cf90 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72    }.  .    /* Wr
2cfa0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2cfb0 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
2cfc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2cfd0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2cfe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2cff0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d000 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
2d010 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2d020 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
2d030 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2d040 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67 29  ist(pPager, pPg)
2d050 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2d060 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
2d070 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
2d080 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d090 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
2d0a0 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
2d0b0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
2d0c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2d0d0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
2d0e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2d0f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
2d100 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2d110 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2d120 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68   .}../*.** Flush
2d130 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63 65   all unreference
2d140 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  d dirty pages to
2d150 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
2d160 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
2d170 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2d180 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
2d190 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
2d1a0 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
2d1b0 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
2d1c0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2d1d0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2d1e0 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73 65  Cache);.    asse
2d1f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
2d200 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
2d210 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
2d220 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
2d230 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67 48  ist ){.      PgH
2d240 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
2d250 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  t->pDirty;.     
2d260 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66   if( pList->nRef
2d270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2d280 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73 28  c = pagerStress(
2d290 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 70  (void*)pPager, p
2d2a0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  List);.      }. 
2d2b0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65       pList = pNe
2d2c0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
2d2d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d2e0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
2d2f0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  d initialize a n
2d300 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ew Pager object 
2d310 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
2d320 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70  r to it.** in *p
2d330 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65  pPager. The page
2d340 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61  r should eventua
2d350 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20  lly be freed by 
2d360 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f  passing it.** to
2d370 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
2d380 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  se()..**.** The 
2d390 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
2d3a0 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74  nt is the path t
2d3b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d3c0 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20  ile to open..** 
2d3d0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2d3e0 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
2d3f0 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
2d400 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
2d410 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
2d420 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
2d430 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f  be cached. Tempo
2d440 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62  rary files are b
2d450 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
2d460 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
2d470 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e  they are closed.
2d480 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2d490 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
2d4a0 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61   .** all informa
2d4b0 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
2d4c0 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76  cache. It is nev
2d4d0 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  er written to di
2d4e0 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e  sk. .** This can
2d4f0 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
2d500 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ement an in-memo
2d510 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
2d520 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61  ** The nExtra pa
2d530 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65  rameter specifie
2d540 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2d550 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
2d560 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
2d570 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65  g with each page
2d580 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73   reference. This
2d590 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
2d5a0 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a  ble to the user.
2d5b0 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74  ** via the sqlit
2d5c0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
2d5d0 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20 6e  ) API.  When a n
2d5e0 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63  ew page is alloc
2d5f0 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72  ated, the.** fir
2d600 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
2d610 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65 72  is space are zer
2d620 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d 61  oed but the rema
2d630 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74 69  inder is uniniti
2d640 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20  alized..** (The 
2d650 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20 75  extra space is u
2d660 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73 20  sed by btree as 
2d670 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
2d680 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ct.).**.** The f
2d690 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73  lags argument is
2d6a0 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79   used to specify
2d6b0 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74   properties that
2d6c0 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f   affect the.** o
2d6d0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
2d6e0 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64  pager. It should
2d6f0 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20   be passed some 
2d700 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74  bitwise combinat
2d710 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41  ion.** of the PA
2d720 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a  GER_* flags..**.
2d730 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20  ** The vfsFlags 
2d740 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
2d750 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74  itmask to pass t
2d760 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  o the flags para
2d770 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
2d780 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f  xOpen() method o
2d790 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56  f the supplied V
2d7a0 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  FS when opening 
2d7b0 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  files. .**.** If
2d7c0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
2d7d0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
2d7e0 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64  nd the specified
2d7f0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a   file opened .**
2d800 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53   successfully, S
2d810 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2d820 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
2d830 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  r set to point t
2d840 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67  o.** the new pag
2d850 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  er object. If an
2d860 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
2d870 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74  ppPager is set t
2d880 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72  o NULL.** and er
2d890 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65  ror code returne
2d8a0 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2d8b0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2d8c0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c  TE_NOMEM.** (sql
2d8d0 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20  ite3Malloc() is 
2d8e0 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
2d8f0 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45   memory), SQLITE
2d900 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a  _CANTOPEN or .**
2d910 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f   various SQLITE_
2d920 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a  IO_XXX errors..*
2d930 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d940 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
2d950 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
2d960 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
2d970 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
2d980 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
2d990 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
2d9a0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
2d9b0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
2d9c0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2d9d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d9e0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
2d9f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2da00 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
2da10 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
2da20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2da30 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
2da40 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
2da50 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2da60 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
2da70 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2da80 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
2da90 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
2daa0 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  fsFlags,        
2dab0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
2dac0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
2dad0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2dae0 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  () */.  void (*x
2daf0 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
2db00 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
2db10 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  reinitialize pag
2db20 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  es */.){.  u8 *p
2db30 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
2db40 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ager = 0;       
2db50 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2db60 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20  to allocate and 
2db70 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
2db80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2db90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2dba0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d  ode */.  int tem
2dbb0 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  pFile = 0;      
2dbc0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65    /* True for te
2dbd0 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20  mp files (incl. 
2dbe0 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29  in-memory files)
2dbf0 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   */.  int memDb 
2dc00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2dc10 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2dc20 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
2dc30 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ile */.#ifdef SQ
2dc40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45  LITE_ENABLE_DESE
2dc50 52 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65  RIALIZE.  int me
2dc60 6d 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mJM = 0;        
2dc70 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75     /* Memory jou
2dc80 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c  rnal mode */.#el
2dc90 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a  se.# define memJ
2dca0 4d 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74  M 0.#endif.  int
2dcb0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2dcc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2dcd0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2dce0 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2dcf0 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2dd00 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2dd10 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2dd20 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2dd30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2dd40 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2dd50 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2dd60 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2dd70 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2dd80 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2dd90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2dda0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2ddb0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2ddc0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2ddd0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2dde0 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2ddf0 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2de00 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2de10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2de20 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2de30 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2de40 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2de50 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2de60 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2de70 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2de80 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2de90 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2dea0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2deb0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2dec0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2ded0 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2dee0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2def0 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2df00 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2df10 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2df20 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2df30 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2df40 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2df50 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2df60 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2df70 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2df80 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2df90 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2dfa0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2dfb0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2dfc0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2dfd0 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2dfe0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2dff0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2e000 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2e010 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2e020 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2e030 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2e040 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2e050 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2e060 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2e070 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2e080 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2e090 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2e0a0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2e0b0 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2e0c0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2e0d0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2e0e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e0f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2e100 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2e110 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2e120 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2e130 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2e140 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2e150 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2e160 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2e170 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2e180 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2e190 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2e1a0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2e1b0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2e1c0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2e1d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2e1e0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2e1f0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2e200 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2e210 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2e220 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2e230 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2e240 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2e250 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2e260 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2e270 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2e280 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2e290 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2e2a0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2e2b0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2e2c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e2d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e2e0 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2e2f0 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2e300 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2e310 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2e320 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2e330 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2e340 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2e350 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2e360 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2e370 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2e380 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2e390 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2e3a0 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2e3b0 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2e3c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e3d0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2e3e0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2e3f0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2e400 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2e410 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2e420 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2e430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2e440 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2e450 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2e460 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2e470 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e480 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2e490 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2e4a0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2e4b0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2e4c0 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2e4d0 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2e4e0 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2e4f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2e500 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2e510 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2e520 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2e530 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2e540 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2e550 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2e560 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2e570 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2e580 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2e590 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2e5a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2e5b0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2e5c0 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2e5d0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2e5e0 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2e5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e600 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2e610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2e620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2e640 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2e650 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2e660 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2e670 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2e680 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2e690 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2e6a0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2e6b0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2e6c0 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2e6d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e6e0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2e6f0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2e700 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2e710 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2e720 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2e730 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2e740 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e750 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2e760 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2e770 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2e780 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2e790 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2e7a0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2e7b0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2e7c0 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2e7d0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2e7e0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2e7f0 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2e800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2e810 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2e820 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2e830 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2e840 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2e850 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2e860 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2e870 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2e880 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e8a0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2e8b0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2e8c0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2e8d0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e8e0 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2e8f0 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2e900 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2e910 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2e920 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2e930 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2e940 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2e950 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2e960 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2e970 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2e980 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2e990 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2e9a0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2e9b0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2e9c0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2e9d0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2e9e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2e9f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2ea00 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2ea10 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2ea20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2ea30 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2ea40 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2ea50 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2ea60 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2ea70 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2ea80 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2ea90 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2eaa0 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2eab0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2eac0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2ead0 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2eae0 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2eaf0 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2eb00 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2eb10 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2eb20 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2eb30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2eb40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2eb50 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2eb60 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2eb70 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2eb80 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2eb90 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2eba0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2ebb0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2ebc0 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2ebd0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ebe0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2ebf0 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2ec00 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2ec10 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2ec20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2ec30 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2ec40 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2ec50 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2ec60 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2ec70 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2ec80 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2ec90 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2eca0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2ecb0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2ecc0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2ecd0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2ece0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2ecf0 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2ed00 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2ed10 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2ed20 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2ed30 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2ed40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2ed50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2ed60 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2ed70 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2ed80 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2ed90 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2eda0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2edb0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2edc0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2edd0 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2ede0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2edf0 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2ee00 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2ee10 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2ee20 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2ee30 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2ee40 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2ee50 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2ee60 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2ee70 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2ee80 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2ee90 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2eea0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2eeb0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2eec0 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2eed0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2eee0 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2eef0 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2ef00 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2ef10 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2ef20 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2ef30 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2ef40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2ef50 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2ef60 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2ef70 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2ef80 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2ef90 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2efa0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2efb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2efc0 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2efd0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2efe0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2eff0 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2f000 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2f010 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2f020 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2f030 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2f040 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2f050 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2f060 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f080 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2f090 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2f0a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2f0b0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f0c0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2f0d0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2f0e0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2f0f0 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2f100 62 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  b );.#ifdef SQLI
2f110 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49  TE_ENABLE_DESERI
2f120 41 4c 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20  ALIZE.    memJM 
2f130 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2f140 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
2f150 23 65 6e 64 69 66 0a 20 20 20 20 72 65 61 64 4f  #endif.    readO
2f160 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49  nly = (fout&SQLI
2f170 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2f180 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  )!=0;..    /* If
2f190 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
2f1a0 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
2f1b0 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
2f1c0 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20   access,.    ** 
2f1d0 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74  choose a default
2f1e0 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61   page size in ca
2f1f0 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72  se we have to cr
2f200 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  eate the.    ** 
2f210 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2f220 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
2f230 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
2f240 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  mum of:.    **. 
2f250 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
2f260 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2f270 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b  IZE,.    **    +
2f280 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
2f290 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
2f2a0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
2f2b0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
2f2c0 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
2f2d0 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
2f2e0 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
2f2f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
2f300 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f310 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
2f320 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
2f330 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
2f340 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
2f350 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29   if( !readOnly )
2f360 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63  {.        setSec
2f370 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
2f380 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f390 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2f3a0 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2f3b0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2f3c0 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
2f3d0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2f3e0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2f3f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
2f400 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
2f410 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
2f420 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f430 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
2f440 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f450 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f460 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
2f470 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f480 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2f490 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61  eDflt = (u32)pPa
2f4a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
2f4b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f4c0 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
2f4d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2f4e0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
2f4f0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
2f500 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
2f510 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
2f520 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
2f530 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
2f540 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2f550 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
2f560 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
2f570 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f580 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2f590 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
2f5a0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
2f5b0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2f5c0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2f5d0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f5e0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2f5f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
2f600 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
2f610 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
2f620 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f630 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2f640 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  i;.            }
2f650 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f660 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2f670 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
2f680 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c  er->noLock = sql
2f690 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f6a0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c  (zFilename, "nol
2f6b0 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ock", 0);.      
2f6c0 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54  if( (iDc & SQLIT
2f6d0 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c  E_IOCAP_IMMUTABL
2f6e0 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20  E)!=0.       || 
2f6f0 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
2f700 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ean(zFilename, "
2f710 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29  immutable", 0) )
2f720 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46  {.          vfsF
2f730 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
2f740 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
2f750 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74          goto act
2f760 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b  _like_temp_file;
2f770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
2f790 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  f a temporary fi
2f7a0 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  le is requested,
2f7b0 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65   it is not opene
2f7c0 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
2f7d0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
2f7e0 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65  se we accept the
2f7f0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2f800 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74  ze and delay act
2f810 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65  ually.    ** ope
2f820 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e  ning the file un
2f830 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61  til the first ca
2f840 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e  ll to OsWrite().
2f850 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2f860 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c  his branch is al
2f870 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e  so run for an in
2f880 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2f890 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20  . An in-memory. 
2f8a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
2f8b0 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20  s the same as a 
2f8c0 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69  temp-file that i
2f8d0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
2f8e0 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69  out to.    ** di
2f8f0 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69  sk and uses an i
2f900 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63  n-memory rollbac
2f910 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  k journal..    *
2f920 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2f930 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66  anch also runs f
2f940 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20  or files marked 
2f950 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20  as immutable..  
2f960 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74    */ .act_like_t
2f970 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65  emp_file:.    te
2f980 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20  mpFile = 1;.    
2f990 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2f9a0 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20   PAGER_READER;  
2f9b0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2f9c0 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
2f9d0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67  lock */.    pPag
2f9e0 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c  er->eLock = EXCL
2f9f0 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f  USIVE_LOCK;    /
2fa00 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65  * Pretend we are
2fa10 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f   in EXCLUSIVE mo
2fa20 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  de */.    pPager
2fa30 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20  ->noLock = 1;   
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa50 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f  Do no locking */
2fa60 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
2fa70 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  (vfsFlags&SQLITE
2fa80 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2fa90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
2faa0 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f  ollowing call to
2fab0 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
2fac0 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65  e() serves to se
2fad0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a  t the value of .
2fae0 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53    ** Pager.pageS
2faf0 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63  ize and to alloc
2fb00 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54  ate the Pager.pT
2fb10 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a  mpSpace buffer..
2fb20 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
2fb30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fb40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fb50 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  memDb==0 );.    
2fb60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fb70 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
2fb80 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74  ger, &szPageDflt
2fb90 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63  , -1);.    testc
2fba0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
2fbb0 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
2fbc0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50  Initialize the P
2fbd0 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f  Cache object. */
2fbe0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2fbf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74  E_OK ){.    nExt
2fc00 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2fc10 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ra);.    assert(
2fc20 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45   nExtra>=8 && nE
2fc30 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20  xtra<1000 );.   
2fc40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2fc50 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
2fc60 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
2fc70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
2fc80 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2fc90 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2fca0 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2fcb0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2fcc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2fcd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2fce0 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  d above, free th
2fcf0 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74 75  e  Pager structu
2fd00 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
2fd10 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2fd20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fd30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
2fd40 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
2fd50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
2fd60 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
2fd70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73  TmpSpace);.    s
2fd80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2fd90 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2fda0 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
2fdb0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20  TRACE(("OPEN %d 
2fdc0 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
2fdd0 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c  EID(pPager->fd),
2fde0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2fdf0 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  me));.  IOTRACE(
2fe00 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c  ("OPEN %p %s\n",
2fe10 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
2fe20 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20  >zFilename))..  
2fe30 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2fe40 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
2fe50 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nal;.  /* pPager
2fe60 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
2fe70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2fe80 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
2fe90 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2fea0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Ref = 0; */.  /*
2feb0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
2fec0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fed0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
2fee0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fef0 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
2ff00 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
2ff10 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
2ff20 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
2ff30 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
2ff40 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
2ff50 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2ff60 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
2ff70 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
2ff80 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
2ff90 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
2ffa0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2ffb0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2ffc0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
2ffd0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2ffe0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
2fff0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
30000 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
30010 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
30020 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
30030 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
30040 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
30050 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
30060 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
30070 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
30080 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
30090 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
300a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
300b0 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73  )readOnly;.  ass
300c0 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20  ert( useJournal 
300d0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
300e0 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile );.  pPager-
300f0 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
30100 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66  ->tempFile;.  if
30110 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
30120 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
30130 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30140 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
30150 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61  t( pPager->extra
30160 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
30170 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
30180 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
30190 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
301a0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d  r->walSyncFlags=
301b0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
301c0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
301d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
301e0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
301f0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
30200 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
30210 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
30220 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53      pPager->walS
30230 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
30240 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20  E_SYNC_NORMAL | 
30250 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  (SQLITE_SYNC_NOR
30260 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f  MAL<<2);.  }.  /
30270 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
30280 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30290 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
302a0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
302b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
302c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
302d0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
302e0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
302f0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
30300 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
30310 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
30320 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
30330 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30340 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
30350 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
30360 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
30370 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
30380 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
30390 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
303a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
303b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
303c0 44 62 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20  Db || memJM ){. 
303d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
303e0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
303f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
30400 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
30410 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
30420 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
30430 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
30440 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
30450 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
30460 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 73  r = xReinit;.  s
30470 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
30480 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d  Pager);.  /* mem
30490 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
304a0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
304b0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
304c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a  .  /* pPager->sz
304d0 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
304e0 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20  FAULT_MMAP_SIZE 
304f0 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62  // will be set b
30500 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20  y btree.c */..  
30510 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
30520 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
30530 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
30540 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30550 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
30560 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
30570 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
30580 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
30590 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
305a0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
305b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
305c0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
305d0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
305e0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
305f0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
30600 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
30610 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
30620 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
30630 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
30640 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
30650 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
30660 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
30670 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
30680 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
30690 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
306a0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
306b0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
306c0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
306d0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
306e0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
306f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30700 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
30710 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
30720 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
30730 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
30740 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
30750 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
30760 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
30770 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
30780 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
30790 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
307a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
307b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
307c0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
307d0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
307e0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
307f0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
30800 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
30810 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
30820 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
30830 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
30840 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
30850 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
30860 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
30870 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
30880 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
30890 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
308a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
308b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
308c0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
308d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
308e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
308f0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
30900 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
30910 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
30920 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
30930 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
30940 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
30950 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30960 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30970 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
30980 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
30990 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
309a0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
309b0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
309c0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
309d0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
309e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
309f0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
30a00 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
30a10 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
30a20 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
30a30 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30a40 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
30a50 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
30a60 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
30a70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
30a80 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
30a90 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
30aa0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
30ab0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
30ac0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
30ad0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
30ae0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
30af0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
30b00 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
30b10 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
30b20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
30b30 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
30b40 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
30b50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
30b60 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
30b70 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
30b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
30b90 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
30ba0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
30bb0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
30bc0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
30bd0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
30be0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
30bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30c00 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30c10 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
30c20 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
30c30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30c40 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
30c50 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
30c60 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
30c70 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
30c80 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
30c90 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
30ca0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
30cb0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
30cc0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
30cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30ce0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30cf0 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
30d00 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
30d10 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
30d20 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
30d30 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
30d40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
30d50 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
30d60 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
30d70 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
30d80 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
30d90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
30da0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
30db0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
30dc0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30dd0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
30de0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30df0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
30e00 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
30e10 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30e20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
30e30 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
30e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
30e50 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
30e60 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
30e70 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
30e80 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
30e90 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
30ea0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
30eb0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
30ec0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
30ed0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
30ee0 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
30ef0 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
30f00 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
30f10 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
30f20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
30f30 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
30f40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30f50 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30f60 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
30f70 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
30f80 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
30f90 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
30fa0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
30fb0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
30fc0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
30fd0 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
30fe0 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
30ff0 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
31000 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
31010 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
31020 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
31030 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
31040 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
31050 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
31060 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
31070 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
31080 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
31090 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
310a0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
310b0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
310c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
310d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
310e0 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
310f0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
31100 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31110 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
31120 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31130 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
31140 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
31150 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31160 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31170 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
31180 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
31190 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
311a0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
311b0 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
311c0 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
311d0 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
311e0 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
311f0 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
31200 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
31210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31220 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
31230 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
31240 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
31250 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
31260 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
31270 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
31280 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
31290 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
312a0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
312b0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
312c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
312d0 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
312e0 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
312f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
31300 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
31310 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
31320 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
31330 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
31340 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
31350 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
31360 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
31370 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
31380 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
31390 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
313a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
313b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
313c0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
313d0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
313e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
313f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
31400 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
31410 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31420 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
31430 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
31440 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
31450 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
31460 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31470 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
31480 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31490 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
314a0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
314b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
314c0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
314d0 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
314e0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
314f0 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
31500 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
31510 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
31520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31530 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
31540 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
31550 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
31560 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
31570 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
31580 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
31590 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
315a0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
315b0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
315c0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
315d0 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
315e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
315f0 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
31600 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
31610 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
31620 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
31630 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
31640 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
31650 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
31660 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
31670 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31680 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
31690 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
316a0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
316b0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
316c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
316d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
316e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
316f0 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
31700 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31710 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
31720 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
31730 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
31740 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31750 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
31760 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
31780 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31790 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
317a0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
317b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
317c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
317d0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
317e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
317f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
31800 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
31810 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
31820 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
31830 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
31840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
31850 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
31860 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
31870 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
31880 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
31890 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
318a0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
318b0 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
318c0 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
318d0 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
318e0 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
318f0 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
31900 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
31910 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
31920 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
31930 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
31940 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
31950 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
31960 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
31970 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
31980 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
31990 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
319a0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
319b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
319c0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
319d0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
319e0 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
319f0 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
31a00 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
31a10 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
31a20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
31a30 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
31a40 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
31a50 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
31a60 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
31a70 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
31a80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
31a90 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
31aa0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
31ab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31ac0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31ad0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31ae0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
31af0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
31b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31b10 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
31b20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
31b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31b40 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
31b50 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
31b60 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
31b70 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
31b80 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
31b90 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
31ba0 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
31bb0 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
31bc0 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
31bd0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
31be0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
31bf0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
31c00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
31c10 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
31c20 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
31c30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
31c40 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
31c50 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
31c60 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
31c70 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
31c80 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
31c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31ca0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
31cb0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31cc0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
31cd0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
31ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31cf0 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
31d00 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
31d10 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
31d20 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
31d30 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
31d40 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
31d50 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
31d60 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
31d70 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
31d80 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
31d90 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
31da0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
31db0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31dc0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
31dd0 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
31de0 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
31df0 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
31e00 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
31e10 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
31e20 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
31e30 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
31e40 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
31e50 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
31e60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31e70 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
31e80 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
31e90 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
31ea0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
31eb0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
31ec0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
31ed0 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
31ee0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
31ef0 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
31f00 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
31f10 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
31f20 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
31f30 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
31f40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
31f50 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
31f60 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
31f70 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
31f80 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
31f90 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
31fa0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
31fb0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
31fc0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
31fd0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
31fe0 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
31ff0 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
32000 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
32010 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
32020 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
32030 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
32040 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
32050 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
32060 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
32070 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
32080 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
32090 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
320a0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
320b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
320c0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
320d0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
320e0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
320f0 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
32100 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
32110 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
32120 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
32130 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
32140 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
32150 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
32160 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
32170 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
32180 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
32190 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
321a0 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
321b0 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f  access mode.  */
321c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
321d0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
321e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
321f0 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
32200 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
32210 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
32220 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32230 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32240 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
32250 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
32260 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
32270 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
32280 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
32290 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
322a0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
322b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
322c0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
322d0 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   int bHotJournal
322e0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f   = 1;          /
322f0 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
32300 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75  exists a hot jou
32310 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal-file */..  
32320 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
32330 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32340 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32350 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
32360 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
32370 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20  LOCK );..    rc 
32380 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
32390 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
323a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
323b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
323c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
323d0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
323e0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
323f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
32400 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
32410 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32420 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
32430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
32440 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
32450 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
32460 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
32470 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
32480 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
32490 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
324a0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
324b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
324c0 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
324d0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
324e0 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
324f0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
32500 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
32510 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
32520 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32530 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
32540 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
32550 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
32560 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
32570 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
32580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32590 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
325a0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
325b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
325c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
325d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
325e0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
325f0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
32600 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
32610 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
32620 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
32630 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
32640 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
32650 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
32660 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
32670 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
32680 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
32690 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
326a0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
326b0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
326c0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
326d0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
326e0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
326f0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
32700 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
32710 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32720 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
32730 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
32740 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
32750 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
32760 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
32770 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
32780 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
32790 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
327a0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
327b0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
327c0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
327d0 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
327e0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
327f0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
32800 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
32810 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
32820 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
32830 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
32840 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
32850 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
32860 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
32870 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
32880 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
32890 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
328a0 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
328b0 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
328c0 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
328d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
328e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
328f0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
32900 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
32910 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
32920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32930 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
32940 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
32950 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
32960 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
32970 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
32980 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
32990 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
329a0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
329b0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
329c0 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
329d0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
329e0 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
329f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
32a00 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
32a10 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
32a20 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
32a30 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
32a40 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
32a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
32a60 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
32a70 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
32a80 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
32a90 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
32aa0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
32ab0 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
32ac0 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
32ad0 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
32ae0 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
32af0 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
32b00 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
32b10 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
32b20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
32b30 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
32b40 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
32b50 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
32b60 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
32b70 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
32b80 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
32b90 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
32ba0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
32bb0 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
32bc0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
32bd0 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
32be0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
32bf0 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
32c00 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
32c10 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
32c20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
32c30 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
32c40 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
32c50 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
32c60 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
32c70 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
32c80 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32c90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
32ca0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
32cb0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
32cc0 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
32cd0 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
32ce0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
32cf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
32d00 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
32d10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
32d20 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
32d30 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
32d40 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
32d50 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
32d60 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
32d70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32d80 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
32d90 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
32da0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
32db0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
32dc0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32dd0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
32de0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
32df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
32e00 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32e20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32e30 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32e40 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32e50 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
32e60 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
32e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32e80 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
32e90 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
32ea0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32eb0 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
32ec0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
32ed0 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
32ee0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
32ef0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
32f00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32f10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
32f20 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
32f30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32f40 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
32f50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
32f60 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
32f70 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
32f80 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
32f90 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
32fa0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
32fb0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
32fc0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
32fd0 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
32fe0 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
32ff0 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
33000 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
33010 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
33020 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
33030 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
33040 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
33050 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
33060 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
33070 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
33080 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
33090 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
330a0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
330b0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
330c0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
330d0 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
330e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
330f0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
33100 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
33110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
33120 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
33130 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
33140 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
33150 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
33160 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
33170 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
33180 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
331a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
331b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
331c0 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
331d0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
331e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
331f0 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
33200 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33210 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
33220 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
33230 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
33240 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
33250 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
33260 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
33270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33280 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
33290 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
332a0 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
332b0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
332c0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
332d0 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
332e0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
332f0 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
33300 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
33310 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
33320 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
33330 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
33340 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
33350 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
33360 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
33370 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
33380 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
33390 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
333a0 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
333b0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
333c0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
333d0 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
333e0 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
333f0 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
33400 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
33410 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
33420 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
33430 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
33440 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
33450 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
33460 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
33470 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
33480 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
33490 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
334a0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
334b0 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
334c0 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
334d0 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
334e0 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
334f0 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
33500 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
33510 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
33520 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
33530 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
33540 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
33550 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
33560 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
33570 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
33580 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
33590 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
335a0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
335b0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
335c0 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
335d0 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
335e0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
335f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
33600 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
33610 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
33620 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
33630 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
33640 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
33650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
33660 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
33670 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
33680 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
33690 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
336a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
336b0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
336c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
336d0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
336e0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
336f0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
33700 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
33710 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
33720 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
33730 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
33740 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
33750 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
33760 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
33770 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
33780 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
33790 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
337a0 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
337b0 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
337c0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
337d0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
337e0 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
337f0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
33800 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
33810 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
33820 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
33830 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
33840 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
33850 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
33860 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
33870 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
33880 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
33890 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
338a0 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
338b0 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
338c0 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
338d0 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
338e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
338f0 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
33900 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
33910 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
33920 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
33930 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
33940 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
33950 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
33960 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
33970 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
33980 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
33990 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
339a0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
339b0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
339c0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
339d0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
339e0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
339f0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
33a00 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
33a10 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
33a20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
33a30 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
33a40 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
33a50 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
33a60 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
33a70 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
33a80 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
33a90 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
33aa0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
33ab0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
33ac0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
33ad0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
33ae0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
33af0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
33b00 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
33b10 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
33b20 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
33b30 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
33b40 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72  Vers)));.      r
33b50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
33b60 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
33b70 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
33b80 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32  f(dbFileVers), 2
33b90 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
33ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33bb0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
33bc0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
33bd0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
33be0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
33bf0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
33c00 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
33c10 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
33c20 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
33c30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33c40 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
33c50 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
33c60 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
33c70 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
33c80 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
33c90 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  reset(pPager);..
33ca0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70          /* Unmap
33cb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33cc0 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62  le. It is possib
33cd0 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c  le that external
33ce0 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20   processes.     
33cf0 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74     ** may have t
33d00 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61 74  runcated the dat
33d10 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
33d20 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20  hen extended it 
33d30 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  back.        ** 
33d40 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
33d50 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20  size while this 
33d60 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20  process was not 
33d70 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a  holding a lock..
33d80 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68          ** In th
33d90 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d 61  is case there ma
33da0 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72 2e  y exist a Pager.
33db0 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61  pMap mapping tha
33dc0 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20 20  t appears.      
33dd0 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72    ** to be the r
33de0 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69 73  ight size but is
33df0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61   not actually va
33e00 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a  lid. Avoid this.
33e10 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
33e20 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70  bility by unmapp
33e30 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65 2e  ing the db here.
33e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
33e50 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
33e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
33e70 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
33e80 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
33e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33ea0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
33eb0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
33ec0 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20  WAL file in the 
33ed0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65  file-system, ope
33ee0 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  n this database 
33ef0 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f  in WAL.    ** mo
33f00 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  de. Otherwise, t
33f10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
33f20 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20  ction call is a 
33f30 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
33f40 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
33f50 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61  WalIfPresent(pPa
33f60 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ger);.#ifndef SQ
33f70 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
33f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
33f90 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d  ->pWal==0 || rc=
33fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65  =SQLITE_OK );.#e
33fb0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
33fc0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
33fd0 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  er) ){.    asser
33fe0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
33ff0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
34000 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
34010 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
34020 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
34030 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26  r->tempFile==0 &
34040 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
34050 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
34060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
34070 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
34080 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
34090 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
340a0 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
340b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
340c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
340d0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
340e0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
340f0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
34100 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34110 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
34120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
34130 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
34140 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
34150 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c    pPager->hasHel
34160 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b  dSharedLock = 1;
34170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
34180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
34190 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
341a0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
341b0 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
341c0 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
341d0 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
341e0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
341f0 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
34200 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
34210 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
34220 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
34230 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
34240 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
34250 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
34260 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
34270 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
34280 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
34290 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
342a0 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
342b0 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
342c0 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
342d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
342e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
342f0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
34300 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20  PCache)==0 ){.  
34310 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34320 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b  ->nMmapOut==0 );
34330 20 2f 2a 20 62 65 63 61 75 73 65 20 70 61 67 65   /* because page
34340 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72  1 is never memor
34350 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20  y mapped */.    
34360 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
34370 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
34380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
34390 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
343a0 68 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f  hods each try to
343b0 20 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72   acquire a refer
343c0 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67  ence to a.** pag
343d0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
343e0 65 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20  er pgno. If the 
343f0 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65  requested refere
34400 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65  nce is .** succe
34410 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
34420 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  , it is copied t
34430 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51  o *ppPage and SQ
34440 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
34450 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
34460 65 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c  e different impl
34470 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
34480 68 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  he getter method
34490 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e   depending.** on
344a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
344b0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  te of the pager.
344c0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61  .**.**     getPa
344d0 67 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20  geNormal()      
344e0 20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61     --  The norma
344f0 6c 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20  l getter.**     
34500 67 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20  getPageError()  
34510 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64          --  Used
34520 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
34530 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
34540 74 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  te.**     getPag
34550 65 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20  eMmap()         
34560 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65    --  Used if me
34570 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
34580 69 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a  is enabled.**.**
34590 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
345a0 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
345b0 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
345c0 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
345d0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
345e0 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
345f0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
34600 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
34610 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
34620 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
34630 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
34640 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
34650 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
34660 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
34670 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
34680 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
34690 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
346a0 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
346b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
346c0 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
346d0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
346e0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
346f0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
34700 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
34710 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
34720 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
34730 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
34740 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
34750 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
34760 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
34770 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
34780 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
34790 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
347a0 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
347b0 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
347c0 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
347d0 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
347e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
347f0 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
34800 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
34810 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
34820 72 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61  r if .** the fla
34830 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e  gs parameter con
34840 74 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f  tains the PAGER_
34850 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69  GET_NOCONTENT bi
34860 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  t and the .** re
34870 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
34880 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
34890 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
348a0 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
348b0 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
348c0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
348d0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
348e0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
348f0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
34900 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
34910 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52   .**.** If PAGER
34920 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34930 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
34940 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
34950 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
34960 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
34970 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
34980 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  urs in two scena
34990 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
349a0 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20   When reading a 
349b0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
349c0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
349d0 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  abase, and.**.**
349e0 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76     b) When a sav
349f0 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20  epoint is being 
34a00 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
34a10 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a  we need to load.
34a20 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61  **      a new pa
34a30 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ge into the cach
34a40 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77  e to be filled w
34a50 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61  ith the data rea
34a60 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74  d.**      from t
34a70 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75  he savepoint jou
34a80 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50  rnal..**.** If P
34a90 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
34aa0 4e 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  NT is true, then
34ab0 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
34ac0 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
34ad0 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67  tead.** of being
34ae0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
34af0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
34b00 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
34b10 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
34b20 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
34b30 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
34b40 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
34b50 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
34b60 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
34b70 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
34b80 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
34b90 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
34ba0 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
34bb0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
34bc0 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
34bd0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
34be0 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
34bf0 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
34c00 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
34c10 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
34c20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
34c30 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
34c40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
34c50 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
34c60 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
34c70 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
34c80 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
34c90 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
34ca0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
34cb0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
34cc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
34cd0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
34ce0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
34cf0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
34d00 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
34d10 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
34d20 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
34d30 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
34d40 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
34d50 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
34d60 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
34d70 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
34d80 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
34d90 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
34da0 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
34db0 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
34dc0 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
34dd0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
34de0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
34df0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
34e00 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
34e10 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
34e20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
34e30 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
34e40 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
34e50 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
34e60 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
34e70 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
34e80 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
34e90 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
34ea0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
34eb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
34ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
34ed0 50 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61  PageNormal(.  Pa
34ee0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
34ef0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
34f00 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
34f10 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
34f20 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
34f30 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
34f40 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
34f50 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
34f60 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
34f70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
34f80 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
34f90 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
34fa0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
34fb0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69   flags */.){.  i
34fc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34fd0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  K;.  PgHdr *pPg;
34fe0 0a 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b  .  u8 noContent;
34ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35000 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41     /* True if PA
35010 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
35020 54 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71  T is set */.  sq
35030 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67  lite3_pcache_pag
35040 65 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73  e *pBase;..  ass
35050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
35060 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
35070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35080 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
35090 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
350a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
350b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
350c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
350d0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
350e0 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a  aredLock==1 );..
350f0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
35100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
35110 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42  RRUPT_BKPT;.  pB
35120 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ase = sqlite3Pca
35130 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
35140 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
35150 33 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d  3);.  if( pBase=
35160 3d 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  =0 ){.    pPg = 
35170 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
35180 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74  te3PcacheFetchSt
35190 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43  ress(pPager->pPC
351a0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61  ache, pgno, &pBa
351b0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  se);.    if( rc!
351c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
351d0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
351e0 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61  err;.    if( pBa
351f0 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  se==0 ){.      r
35200 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
35210 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
35220 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
35230 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  err;.    }.  }. 
35240 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
35250 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
35260 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
35270 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
35280 20 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72   pBase);.  asser
35290 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65  t( pPg==(*ppPage
352a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
352b0 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
352c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
352d0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
352e0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
352f0 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e  0 );..  noConten
35300 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
35310 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
35320 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d  )!=0;.  if( pPg-
35330 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
35340 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
35350 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
35360 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
35370 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
35380 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
35390 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
353a0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
353b0 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
353c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
353d0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
353e0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
353f0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
35400 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
35410 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
35420 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74  _HIT]++;.    ret
35430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
35440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
35450 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
35460 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
35470 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
35480 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
35490 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
354a0 7a 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73  zed. But first s
354b0 6f 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73  ome error checks
354c0 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
354d0 28 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  (1) The maximum 
354e0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
354f0 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e  ^31.    ** (2) N
35500 65 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63  ever try to fetc
35510 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  h the locking pa
35520 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ge.    */.    if
35530 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
35540 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
35550 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
35560 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
35570 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
35580 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
35590 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
355a0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
355b0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
355c0 50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65  Pager;..    asse
355d0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
355e0 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44  er->fd) || !MEMD
355f0 42 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73  B );.    if( !is
35600 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
35610 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69   || pPager->dbSi
35620 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e  ze<pgno || noCon
35630 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tent ){.      if
35640 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
35650 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
35660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
35670 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
35680 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
35690 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
356a0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
356b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
356c0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
356d0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
356e0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
356f0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
35700 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
35710 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
35720 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
35730 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
35740 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
35750 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
35760 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
35770 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
35780 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
35790 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
357a0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
357b0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
357c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
357d0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
357e0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
357f0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
35800 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
35810 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
35820 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
35830 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
35840 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
35850 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
35860 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
35870 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
35880 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
35890 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
358a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
358b0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
358c0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
358d0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
358e0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
358f0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
35900 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
35910 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35930 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
35940 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
35950 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
35960 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
35970 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
35980 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
35990 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
359a0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
359b0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
359c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
359d0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
359e0 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
359f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
35a00 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53  t[PAGER_STAT_MIS
35a10 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  S]++;.      rc =
35a20 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
35a30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
35a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35a50 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
35a60 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
35a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
35a80 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
35a90 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  h(pPg);.  }.  re
35aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35ab0 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
35ac0 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
35ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
35ae0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
35af0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
35b00 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
35b10 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
35b20 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70  d(pPager);.  *pp
35b30 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75  Page = 0;.  retu
35b40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
35b50 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
35b60 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65  ZE>0./* The page
35b70 20 67 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e   getter for when
35b80 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49   memory-mapped I
35b90 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  /O is enabled */
35ba0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
35bb0 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72  ageMMap(.  Pager
35bc0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
35bd0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
35be0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35bf0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
35c00 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
35c10 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
35c20 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
35c30 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
35c40 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
35c50 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
35c60 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
35c70 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
35c80 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
35c90 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
35ca0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
35cb0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
35cc0 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  ;.  u32 iFrame =
35cd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
35ce0 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
35cf0 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
35d00 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69  le */..  /* It i
35d10 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20  s acceptable to 
35d20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  use a read-only 
35d30 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20  (mmap) page for 
35d40 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74 0a  any page except.
35d50 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74    ** page 1 if t
35d60 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65  here is no write
35d70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
35d80 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52 45  n or the ACQUIRE
35d90 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66  _READONLY.  ** f
35da0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
35db0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
35dc0 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20   And so long as 
35dd0 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20  the db is not a 
35de0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
35df0 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
35e00 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e  abase.  */.  con
35e10 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d  st int bMmapOk =
35e20 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28   (pgno>1.   && (
35e30 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
35e40 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20  PAGER_READER || 
35e50 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47  (flags & PAGER_G
35e60 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20  ET_READONLY)).  
35e70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53  );..  assert( US
35e80 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
35e90 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
35ea0 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65  HAS_CODEC.  asse
35eb0 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  rt( pPager->xCod
35ec0 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ec==0 );.#endif.
35ed0 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69  .  /* Optimizati
35ee0 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67  on note:  Adding
35ef0 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74   the "pgno<=1" t
35f00 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f  erm before "pgno
35f10 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61  ==0" here.  ** a
35f20 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c  llows the compil
35f30 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20  er optimizer to 
35f40 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c 74  reuse the result
35f50 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31  s of the "pgno>1
35f60 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74  ".  ** test in t
35f70 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61 74  he previous stat
35f80 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64  ement, and avoid
35f90 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30   testing pgno==0
35fa0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d   in the.  ** com
35fb0 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 70  mon case where p
35fc0 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f  gno is large. */
35fd0 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26  .  if( pgno<=1 &
35fe0 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  & pgno==0 ){.   
35ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
36000 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
36010 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36020 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
36030 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
36040 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
36050 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
36060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36070 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
36080 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  edLock==1 );.  a
36090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
360a0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
360b0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61  K );..  if( bMma
360c0 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65 57  pOk && pagerUseW
360d0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
360e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
360f0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
36100 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
36110 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  iFrame);.    if(
36120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36130 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20  {.      *ppPage 
36140 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
36150 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
36160 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26    if( bMmapOk &&
36170 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20   iFrame==0 ){.  
36180 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
36190 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
361a0 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65  te3OsFetch(pPage
361b0 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20  r->fd, .        
361c0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
361d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
361e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
361f0 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29  ze, &pData.    )
36200 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
36210 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
36220 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
36230 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
36240 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61  ER_READER || pPa
36250 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
36260 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 73  .        pPg = s
36270 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
36280 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
36290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
362a0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
362b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
362c0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
362d0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
362e0 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
362f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
36300 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
36310 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
36320 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  )(pgno-1)*pPager
36330 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
36340 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
36350 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
36360 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
36370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
36380 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
36390 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pPg;.        ret
363a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
363b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
363c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
363d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
363e0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
363f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
36400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74    }.  return get
36410 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65  PageNormal(pPage
36420 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
36430 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69   flags);.}.#endi
36440 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
36450 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
36460 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
36470 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68  er method for wh
36480 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
36490 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  an error state *
364a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
364b0 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67  PageError(.  Pag
364c0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
364d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
364e0 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
364f0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
36500 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
36510 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
36520 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
36530 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
36540 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
36550 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
36560 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
36570 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
36580 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
36590 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e  flags */.){.  UN
365a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
365b0 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  gno);.  UNUSED_P
365c0 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
365d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
365e0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
365f0 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61  TE_OK );.  *ppPa
36600 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
36610 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36620 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63  ;.}.../* Dispatc
36630 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68  h all page fetch
36640 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68 65   requests to the
36650 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65 74   appropriate get
36660 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69  ter method..*/.i
36670 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nt sqlite3PagerG
36680 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  et(.  Pager *pPa
36690 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
366a0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
366b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
366c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
366d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
366e0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
366f0 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
36700 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
36710 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
36720 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
36730 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
36740 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
36750 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
36760 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  /.){.  return pP
36770 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65  ager->xGet(pPage
36780 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
36790 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   flags);.}../*.*
367a0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
367b0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
367c0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
367d0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
367e0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
367f0 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
36800 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
36810 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
36820 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
36830 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
36840 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
36850 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
36860 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
36870 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
36880 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
36890 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
368a0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
368b0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
368c0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
368d0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
368e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
368f0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
36900 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36910 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
36920 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36930 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
36940 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
36950 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
36960 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
36970 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
36980 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
36990 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
369a0 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
369b0 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
369c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
369d0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
369e0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
369f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36a00 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
36a10 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
36a20 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
36a30 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
36a40 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
36a50 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
36a60 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
36a70 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
36a80 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
36a90 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
36aa0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
36ab0 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
36ac0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
36ad0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
36ae0 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
36af0 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  erence..**.** Th
36b00 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
36b10 72 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ref() and sqlite
36b20 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
36b30 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  ll() may only be
36b40 0a 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20 6b  .** used if we k
36b50 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  now that the pag
36b60 65 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64  e being released
36b70 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
36b80 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74   page..** The bt
36b90 72 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79 73  ree layer always
36ba0 20 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70 65   holds page1 ope
36bb0 6e 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c  n until the end,
36bc0 20 73 6f 20 74 68 65 73 65 20 66 69 72 73 74 0a   so these first.
36bd0 2a 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20 63  ** to routines c
36be0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  an be used to re
36bf0 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20 6f  lease any page o
36c00 74 68 65 72 20 74 68 61 6e 20 42 74 53 68 61 72  ther than BtShar
36c10 65 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a  ed.pPage1..**.**
36c20 20 55 73 65 20 73 71 6c 69 74 65 33 50 61 67 65   Use sqlite3Page
36c30 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29 20  rUnrefPageOne() 
36c40 74 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65 31  to release page1
36c50 2e 20 20 54 68 69 73 20 6c 61 74 74 65 72 20 72  .  This latter r
36c60 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73  outine.** checks
36c70 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
36c80 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
36c90 20 70 61 67 65 73 20 61 6e 64 20 69 66 20 74 68   pages and if th
36ca0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
36cb0 61 67 65 73 20 72 65 61 63 68 65 73 20 7a 65 72  ages reaches zer
36cc0 6f 20 69 74 20 64 72 6f 70 73 20 74 68 65 20 64  o it drops the d
36cd0 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f  atabase lock..*/
36ce0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
36cf0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44  erUnrefNotNull(D
36d00 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 54  bPage *pPg){.  T
36d10 45 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a  ESTONLY( Pager *
36d20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
36d30 61 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72 74  ager; ).  assert
36d40 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69 66  ( pPg!=0 );.  if
36d50 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
36d60 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
36d70 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
36d80 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67  no!=1 );  /* Pag
36d90 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
36da0 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20  ry mapped */.   
36db0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
36dc0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
36dd0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
36de0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
36df0 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e  );.  }.  /* Do n
36e00 6f 74 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  ot use this rout
36e10 69 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74  ine to release t
36e20 68 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63  he last referenc
36e30 65 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20  e to page1 */.  
36e40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36e50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
36e60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
36e70 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74   );.}.void sqlit
36e80 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
36e90 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
36ea0 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61   pPg ) sqlite3Pa
36eb0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36ec0 70 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  pPg);.}.void sql
36ed0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
36ee0 67 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70 50  geOne(DbPage *pP
36ef0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
36f00 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
36f10 50 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Pg!=0 );.  asser
36f20 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  t( pPg->pgno==1 
36f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  );.  assert( (pP
36f40 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
36f50 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20  _MMAP)==0 ); /* 
36f60 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d  Page1 is never m
36f70 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a  emory mapped */.
36f80 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
36f90 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
36fa0 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54  3PagerResetLockT
36fb0 69 6d 65 6f 75 74 28 70 50 61 67 65 72 29 3b 0a  imeout(pPager);.
36fc0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
36fd0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 70  elease(pPg);.  p
36fe0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
36ff0 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ed(pPager);.}../
37000 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37010 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20  on is called at 
37020 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65  the start of eve
37030 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  ry write transac
37040 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d  tion..** There m
37050 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61  ust already be a
37060 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
37070 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
37080 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
37090 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
370a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
370b0 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ..**.** Open the
370c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
370d0 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61  r pager pPager a
370e0 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e  nd write a journ
370f0 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20  al header.** to 
37100 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
37110 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
37120 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c  tive savepoints,
37130 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   open the sub-jo
37140 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c  urnal.** as well
37150 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
37160 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65  is only used whe
37170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
37180 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20  le is being .** 
37190 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20  opened to write 
371a0 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66  a rollback log f
371b0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
371c0 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64  . It is not used
371d0 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e   .** when openin
371e0 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  g a hot journal 
371f0 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  file to roll it 
37200 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
37210 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37220 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
37230 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e  (as it may be in
37240 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
37250 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66  ,.** then this f
37260 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69  unction just wri
37270 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  tes a journal he
37280 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72  ader to the star
37290 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65  t of the.** alre
372a0 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a  ady open file. .
372b0 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
372c0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
372d0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
372e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
372f0 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70  , the.** Pager.p
37300 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
37310 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
37320 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  located..**.** R
37330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
37340 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
37350 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68   successful. Oth
37360 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a  erwise, return .
37370 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
37380 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
37390 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72  o allocate Pager
373a0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c  .pInJournal fail
373b0 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20  s, or .** an IO 
373c0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70  error code if op
373d0 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ening or writing
373e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
373f0 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  e fails..*/.stat
37400 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
37410 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
37420 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
37430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37450 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
37460 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
37470 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
37480 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
37490 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  fs;   /* Local c
374a0 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e  ache of vfs poin
374b0 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
374c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
374d0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
374e0 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72  OCKED );.  asser
374f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37500 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37510 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37520 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
37530 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61   );.  .  /* If a
37540 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
37550 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20  ror state, this 
37560 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
37570 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a  -op.  But on.  *
37580 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  * the other hand
37590 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
375a0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
375b0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
375c0 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   in.  ** an erro
375d0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
375e0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
375f0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
37600 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37610 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72  e;..  if( !pager
37620 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
37630 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
37640 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
37650 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
37660 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37670 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
37680 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
37690 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
376a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
376b0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
376c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
376d0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
376e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
376f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
37700 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
37710 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
37720 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
37730 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
37740 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
37750 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37760 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
37770 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
37780 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
37790 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
377a0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
377b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
377c0 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nt flags = SQLIT
377d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
377e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
377f0 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ATE;.        int
37800 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20 20   nSpill;..      
37810 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
37820 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
37830 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51      flags |= (SQ
37840 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
37850 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
37860 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
37870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  );.          nSp
37880 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
37890 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
378a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
378b0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
378c0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  = SQLITE_OPEN_MA
378d0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
378e0 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a        nSpill = j
378f0 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
37900 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ager);.        }
37910 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
37920 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
37930 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
37940 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73 61  still has the sa
37950 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64 69  me name as it di
37960 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  d when.        *
37970 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e 61  * it was origina
37980 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20  lly opened. */. 
37990 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74 61         rc = data
379a0 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70 50  baseIsUnmoved(pP
379b0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
379c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
379d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
379e0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
379f0 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20 20  lOpen (.        
37a00 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
37a10 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
37a20 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
37a30 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20 20  , nSpill.       
37a40 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
37a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
37a60 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
37a70 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
37a80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
37a90 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a    }.  .  .    /*
37aa0 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74   Write the first
37ab0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
37ac0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
37ad0 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20  ile and open .  
37ae0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
37af0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
37b00 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
37b10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37b20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  ){.      /* TODO
37b30 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f  : Check if all o
37b40 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c  f these are real
37b50 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ly required. */.
37b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
37b70 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ec = 0;.      pP
37b80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
37b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
37ba0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
37bb0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37bc0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
37bd0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
37be0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
37bf0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
37c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37c10 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
37c20 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
37c30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37c40 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  al);.    pPager-
37c50 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
37c60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
37c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37c80 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37c90 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
37ca0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
37cb0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  = PAGER_WRITER_C
37cc0 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20  ACHEMOD;.  }..  
37cd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37ce0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74  .** Begin a writ
37cf0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e-transaction on
37d00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
37d10 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20  ager object. If 
37d20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e  a .** write-tran
37d30 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
37d40 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
37d50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
37d60 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
37d70 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61   If the exFlag a
37d80 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
37d90 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
37da0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
37db0 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  ED.** lock on th
37dc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37dd0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
37de0 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ue, then acquire
37df0 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20   at least.** an 
37e00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
37e10 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
37e20 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
37e30 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66  no locking .** f
37e40 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65  unctions need be
37e50 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
37e60 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
37e70 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ry argument is n
37e80 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  on-zero, then an
37e90 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70  y sub-journal op
37ea0 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ened.** within t
37eb0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
37ec0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61  will be opened a
37ed0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  s an in-memory f
37ee0 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73  ile. This.** has
37ef0 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68   no effect if th
37f00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
37f10 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
37f20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68  (as it may be wh
37f30 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e  en.** running in
37f40 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29   exclusive mode)
37f50 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73   or if the trans
37f60 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  action does not 
37f70 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62  require a.** sub
37f80 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65  -journal. If the
37f90 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
37fa0 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20  gument is zero, 
37fb0 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
37fc0 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d.** sub-journal
37fd0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
37fe0 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61  in-memory if pPa
37ff0 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ger is an in-mem
38000 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a  ory database, .*
38010 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d  * or using a tem
38020 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65  porary file othe
38030 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
38040 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
38050 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
38060 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73  nt exFlag, int s
38070 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20  ubjInMemory){.  
38080 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
38090 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
380a0 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  r->errCode ) ret
380b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
380c0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
380d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
380e0 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70  AGER_READER && p
380f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41  Pager->eState<PA
38100 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70  GER_ERROR );.  p
38110 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
38120 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e  ory = (u8)subjIn
38130 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41  Memory;..  if( A
38140 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53  LWAYS(pPager->eS
38150 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
38160 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ER) ){.    asser
38170 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
38180 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20  urnal==0 );..   
38190 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
381a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
381b0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
381c0 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  r is configured 
381d0 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d  to use locking_m
381e0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61  ode=exclusive, a
381f0 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65  nd an.      ** e
38200 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
38210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
38220 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
38230 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77  d, obtain it now
38240 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
38250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
38260 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71  lusiveMode && sq
38270 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
38280 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
38290 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  al, -1) ){.     
382a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
382b0 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c  kDb(pPager, EXCL
382c0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
382d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
382e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
382f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
38300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
38310 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57 61   (void)sqlite3Wa
38320 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
38330 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
38340 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
38350 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
38360 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
38370 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
38380 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
38390 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
383a0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
383b0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
383c0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
383d0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
383e0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
383f0 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
38400 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
38410 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
38420 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
38430 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
38440 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
38450 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
38460 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
38470 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
38480 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
38490 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
384a0 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
384b0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
384c0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
384d0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
384e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
384f0 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
38500 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
38510 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
38520 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
38530 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
38540 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
38550 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
38560 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
38570 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
38580 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
38590 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
385a0 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
385b0 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
385c0 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
385d0 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
385e0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
385f0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
38600 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
38610 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
38620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
38630 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
38640 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
38650 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
38660 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
38670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
38680 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
38690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
386a0 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
386b0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
386c0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .