/ Hex Artifact Content
Login

Artifact 3677b427b24c39b3d210a723a021d31bc474b6cc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
8730: 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69  dexes for use wi
8740: 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  th Pager.aStat[]
8750: 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61  . The Pager.aSta
8760: 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  t[] array contai
8770: 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ns.** the values
8780: 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
8790: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54  sing SQLITE_DBST
87a0: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
87b0: 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f  CACHE_MISS .** o
87c0: 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f  r CACHE_WRITE to
87d0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
87e0: 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  us()..*/.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20   PAGER_STAT_HIT 
8800: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
8810: 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23  R_STAT_MISS  1.#
8820: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8830: 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a  T_WRITE 2../*.**
8840: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8850: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8860: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8870: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8880: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
8890: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
88a0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
88b0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
88c0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
88d0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
88e0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
88f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8900: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8910: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8920: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8930: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8940: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8950: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8960: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8970: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8980: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
8990: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
89a0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
89b0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
89c0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
89d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
89e0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
89f0: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8a00: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8a10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8a20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8a30: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8a50: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8a60: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8a70: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8a80: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
8a90: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
8aa0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
8ab0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
8ac0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
8ad0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
8ae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8af0: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8b00: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8b10: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8b20: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8b30: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8b50: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8b60: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8b70: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8b80: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
8b90: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
8ba0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
8bb0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
8bc0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
8bd0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
8be0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8bf0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8c00: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8c10: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8c20: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8c30: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8c40: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8c50: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8c60: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8c70: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8c80: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
8c90: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8ca0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
8cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8cc0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
8cd0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
8ce0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8cf0: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8d00: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8d10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8d20: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8d30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8d40: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8d50: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8d60: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8d70: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8d80: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
8d90: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
8da0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
8db0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
8dc0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
8dd0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
8de0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8df0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8e00: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8e10: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8e20: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8e30: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8e40: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8e50: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8e60: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8e70: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8e80: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
8e90: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
8ea0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
8eb0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
8ec0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
8ed0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
8ee0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8ef0: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8f00: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8f10: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8f20: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8f30: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8f40: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8f50: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8f60: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8f70: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8f80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8f90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8fa0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8fc0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8fd0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8ff0: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
9000: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
9010: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
9020: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
9030: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
9040: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
9050: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
9060: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
9070: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
9080: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
9090: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
90a0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
90b0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
90c0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
90d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
90e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
90f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
9100: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
9110: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
9120: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
9130: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
9140: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9150: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
9160: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
9170: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
9180: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
9190: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
91a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
91b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
91c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
91d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
91e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
91f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
9200: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
9210: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
9220: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
9230: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
9240: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
9250: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
9260: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
9270: 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69  macro USEFETCH i
9280: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
9290: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
92a0: 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78  the xFetch and x
92b0: 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72  Unfetch.** inter
92c0: 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20  faces to access 
92d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
92e0: 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  ng memory-mapped
92f0: 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   I/O..*/.#if SQL
9300: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
9310: 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45  E>0.# define USE
9320: 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62  FETCH(x) ((x)->b
9330: 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a  UseFetch).#else.
9340: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9350: 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  H(x) 0.#endif../
9360: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
9370: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
9380: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
9390: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
93a0: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
93b0: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
93c0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
93d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
93e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
93f0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
9400: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
9410: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
9420: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
9430: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
9440: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
9450: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
9460: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
9470: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
9480: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
9490: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
94a0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
94b0: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
94c0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
94d0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
94e0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
94f0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
9500: 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  ds!=0)../*.** Re
9510: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
9520: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
9530: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
9540: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
9550: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
9560: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
9570: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66  se false..*/.#if
9580: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9590: 5f 57 41 4c 0a 69 6e 74 20 73 71 6c 69 74 65 33  _WAL.int sqlite3
95a0: 50 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  PagerUseWal(Page
95b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
95c0: 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57  turn (pPager->pW
95d0: 61 6c 21 3d 30 29 3b 0a 7d 0a 23 20 64 65 66 69  al!=0);.}.# defi
95e0: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
95f0: 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 73  ) sqlite3PagerUs
9600: 65 57 61 6c 28 78 29 0a 23 65 6c 73 65 0a 23 20  eWal(x).#else.# 
9610: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9620: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9630: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9640: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9650: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9660: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9670: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9680: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9690: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
96a0: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
96b0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
96c0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
96d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
96e0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
96f0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9700: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9710: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9730: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9740: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9750: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9760: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9780: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9790: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
97a0: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
97b0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
97c0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
97d0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
97e0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
97f0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9800: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9830: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9840: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9850: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9860: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9870: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9880: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9890: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
98a0: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
98b0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
98c0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
98d0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
98e0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
98f0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9900: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9910: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9920: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9930: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9940: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9950: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9960: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9970: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9980: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9990: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
99a0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
99b0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
99c0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
99d0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
99e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
99f0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9a00: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9a10: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9a20: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9a30: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9a40: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9a50: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9a60: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9a70: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9a80: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9a90: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9aa0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9ab0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9ad0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9ae0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9af0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9b00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9b10: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
9b20: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
9b30: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9b40: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
9b50: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
9b60: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
9b70: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
9b80: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
9b90: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
9ba0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
9bb0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
9bc0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
9bd0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
9be0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
9bf0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
9c00: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
9c10: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
9c20: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
9c30: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
9c40: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
9c50: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
9c60: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
9c70: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
9c80: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
9c90: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
9ca0: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
9cb0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
9cc0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
9cd0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
9ce0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
9cf0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
9d00: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
9d10: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
9d20: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
9d30: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
9d40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
9d50: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
9d60: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20   !isOpen(p->fd) 
9d70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
9d80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20  ->noSync );.    
9d90: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9da0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9db0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
9dc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
9dd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9de0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
9df0: 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ORY .    );.    
9e00: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9e10: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
9e20: 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  & p->eState!=PAG
9e30: 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61  ER_OPEN );.    a
9e40: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
9e50: 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  al(p)==0 );.  }.
9e60: 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43  .  /* If changeC
9e70: 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c  ountDone is set,
9e80: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
9e90: 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
9ea0: 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e   be held.  ** on
9eb0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
9ec0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9ed0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
9ee0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9ef0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
9f00: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
9f10: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44  ( p->eLock!=PEND
9f20: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73  ING_LOCK );..  s
9f30: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
9f40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
9f50: 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61  ER_OPEN:.      a
9f60: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
9f70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9f80: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
9f90: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
9fa0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
9fb0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
9fc0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
9fd0: 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  )==0 || pPager->
9fe0: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
9ff0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a000: 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a  se PAGER_READER:
a010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a020: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a030: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a050: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a060: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a070: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  t( p->eLock>=SHA
a080: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a090: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a0a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a0b0: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
a0c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a0d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a0e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a0f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a100: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a110: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a120: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a130: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a140: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a150: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
a160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a170: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70  Pager->dbSize==p
a180: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a190: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a1a0: 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
a1b0: 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64  gSize==pPager->d
a1c0: 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  bFileSize );.   
a1d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a1e0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70  r->dbOrigSize==p
a1f0: 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
a200: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
a210: 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
a220: 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ster==0 );.     
a230: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a240: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e PAGER_WRITER_C
a250: 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61  ACHEMOD:.      a
a260: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a270: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a280: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a290: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a2a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a2b0: 20 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65     if( !pagerUse
a2c0: 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
a2d0: 20 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20         /* It is 
a2e0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 69 66  possible that if
a2f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a300: 6c 20 68 65 72 65 20 74 68 61 74 20 6e 65 69 74  l here that neit
a310: 68 65 72 20 74 68 65 0a 20 20 20 20 20 20 20 20  her the.        
a320: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
a330: 6e 6f 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65  nor the WAL file
a340: 20 61 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20   are open. This 
a350: 68 61 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20  happens during. 
a360: 20 20 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c         ** a roll
a370: 62 61 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e  back transaction
a380: 20 74 68 61 74 20 73 77 69 74 63 68 65 73 20 66   that switches f
a390: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  rom journal_mode
a3a0: 3d 6f 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  =off.        ** 
a3b0: 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  to journal_mode=
a3c0: 77 61 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wal..        */.
a3d0: 20 20 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 52 45 53 45 52 56  p->eLock>=RESERV
a3f0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
a400: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a410: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a420: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a430: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a440: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
a450: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c   .             |
a460: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a470: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a480: 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20  ODE_WAL .       
a490: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
a4a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a4b0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50  ->dbOrigSize==pP
a4c0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
a4d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a4e0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a4f0: 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62  Size==pPager->db
a500: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a510: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a520: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a530: 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  DBMOD:.      ass
a540: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a550: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a560: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a570: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a580: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a590: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a5a0: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a5b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a5c0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55   p->eLock>=EXCLU
a5d0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a5e0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
a5f0: 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20  n(p->jfd) .     
a600: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a610: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a620: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a630: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a640: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a650: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a660: 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
a670: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a680: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d  er->dbOrigSize<=
a690: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a6a0: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a6b0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a6c0: 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
a6d0: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a6e0: 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ( p->eLock==EXCL
a6f0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
a700: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a710: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a720: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a730: 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
a740: 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a760: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a770: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a780: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a790: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a7a0: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a7b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a7c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a7d0: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a7e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a7f0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52     case PAGER_ER
a800: 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68  ROR:.      /* Th
a810: 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
a820: 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
a830: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74  ding reference t
a840: 6f 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20  o the pager if. 
a850: 20 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52       ** in ERROR
a860: 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
a870: 65 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75  e the pager shou
a880: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
a890: 64 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a  dropped.      **
a8a0: 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
a8b0: 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ate..      */.  
a8c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a8d0: 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
a8e0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a8f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
a900: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
a910: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
a920: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
a930: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
a940: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  eak;.  }..  retu
a950: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
a960: 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  * ifndef NDEBUG 
a970: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a980: 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52  E_DEBUG ./*.** R
a990: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a9a0: 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61  to a human reada
a9b0: 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20  ble string in a 
a9c0: 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a  static buffer.**
a9d0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
a9e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67  state of the Pag
a9f0: 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  er object passed
aa00: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
aa10: 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65   This.** is inte
aa20: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
aa30: 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73  within debuggers
aa40: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  . For example, a
aa50: 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  s an alternative
aa60: 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70  .** to "print *p
aa70: 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a  Pager" in gdb:.*
aa80: 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74  *.** (gdb) print
aa90: 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61  f "%s", print_pa
aaa0: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
aab0: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ).*/.static char
aac0: 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74   *print_pager_st
aad0: 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ate(Pager *p){. 
aae0: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65   static char zRe
aaf0: 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69  t[1024];..  sqli
ab00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32  te3_snprintf(102
ab10: 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22  4, zRet,.      "
ab20: 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25  Filename:      %
ab30: 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74  s\n".      "Stat
ab40: 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72  e:         %s er
ab50: 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20  rCode=%d\n".    
ab60: 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20    "Lock:        
ab70: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c    %s\n".      "L
ab80: 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f  ocking mode:  lo
ab90: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22  cking_mode=%s\n"
aba0: 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20  .      "Journal 
abb0: 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d  mode:  journal_m
abc0: 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20  ode=%s\n".      
abd0: 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20  "Backing store: 
abe0: 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44  tempFile=%d memD
abf0: 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d  b=%d useJournal=
ac00: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75  %d\n".      "Jou
ac10: 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72  rnal:       jour
ac20: 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72  nalOff=%lld jour
ac30: 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20  nalHdr=%lld\n". 
ac40: 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20       "Size:     
ac50: 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64       dbsize=%d d
ac60: 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46  bOrigSize=%d dbF
ac70: 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20  ileSize=%d\n".  
ac80: 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61      , p->zFilena
ac90: 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53  me.      , p->eS
aca0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f              ? "O
acc0: 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70  PEN" :.        p
acd0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ace0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
acf0: 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20  ? "READER" :.   
ad00: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad10: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
ad20: 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f  KED   ? "WRITER_
ad30: 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20  LOCKED" :.      
ad40: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
ad50: 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
ad60: 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43  OD ? "WRITER_CAC
ad70: 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20  HEMOD" :.       
ad80: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ad90: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
ada0: 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f    ? "WRITER_DBMO
adb0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
adc0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
add0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20  ITER_FINISHED ? 
ade0: 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  "WRITER_FINISHED
adf0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae00: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
ae10: 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  OR           ? "
ae20: 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72  ERROR" : "?error
ae30: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
ae40: 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  p->errCode.     
ae50: 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f   , p->eLock==NO_
ae60: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22  LOCK         ? "
ae70: 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20  NO_LOCK" :.     
ae80: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53     p->eLock==RES
ae90: 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22  ERVED_LOCK   ? "
aea0: 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20  RESERVED" :.    
aeb0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58      p->eLock==EX
aec0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20  CLUSIVE_LOCK  ? 
aed0: 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20  "EXCLUSIVE" :.  
aee0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
aef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
af00: 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20  ? "SHARED" :.   
af10: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55       p->eLock==U
af20: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f  NKNOWN_LOCK    ?
af30: 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65   "UNKNOWN" : "?e
af40: 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70  rror?".      , p
af50: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
af60: 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20  ? "exclusive" : 
af70: 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c  "normal".      ,
af80: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
af90: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
afa0: 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d  DE_MEMORY   ? "m
afb0: 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20  emory" :.       
afc0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
afd0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
afe0: 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f  DE_OFF      ? "o
aff0: 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ff" :.        p-
b000: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b010: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b020: 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65  DELETE   ? "dele
b030: 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  te" :.        p-
b040: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b050: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b060: 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73  PERSIST  ? "pers
b070: 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ist" :.        p
b080: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b090: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b0a0: 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75  _TRUNCATE ? "tru
b0b0: 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20  ncate" :.       
b0c0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b0d0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b0e0: 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77  DE_WAL      ? "w
b0f0: 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a  al" : "?error?".
b100: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b110: 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70  tempFile, (int)p
b120: 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d  ->memDb, (int)p-
b130: 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
b140: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66    , p->journalOf
b150: 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  f, p->journalHdr
b160: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b170: 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  >dbSize, (int)p-
b180: 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e  >dbOrigSize, (in
b190: 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a  t)p->dbFileSize.
b1a0: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a    );..  return z
b1b0: 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  Ret;.}.#endif../
b1c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
b1d0: 6e 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69  nces to the vari
b1e0: 6f 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73  ous page getters
b1f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67   */.static int g
b200: 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67  etPageNormal(Pag
b210: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
b220: 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69  *,int);.static i
b230: 6e 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28  nt getPageError(
b240: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b250: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53  ge**,int);.#if S
b260: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
b270: 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
b280: 20 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67   getPageMMap(Pag
b290: 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a  er*,Pgno,DbPage*
b2a0: 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  *,int);.#endif..
b2b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61  /*.** Set the Pa
b2c0: 67 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20  ger.xGet method 
b2d0: 66 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  for the appropri
b2e0: 61 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ate routine used
b2f0: 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e   to fetch.** con
b300: 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  tent from the pa
b310: 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ger..*/.static v
b320: 6f 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74  oid setGetterMet
b330: 68 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  hod(Pager *pPage
b340: 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
b350: 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
b360: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b370: 67 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69  getPageError;.#i
b380: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
b390: 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65  P_SIZE>0.  }else
b3a0: 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
b3b0: 61 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c  ager).#ifdef SQL
b3c0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
b3d0: 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64   && pPager->xCod
b3e0: 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29  ec==0.#endif.  )
b3f0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47  {.    pPager->xG
b400: 65 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70  et = getPageMMap
b410: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
b420: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
b430: 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  >0 */.  }else{. 
b440: 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20     pPager->xGet 
b450: 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b  = getPageNormal;
b460: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
b470: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
b480: 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
b490: 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20  write page *pPg 
b4a0: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b4b0: 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20  rnal..** A page 
b4c0: 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74  needs to be writ
b4d0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62  ten into the sub
b4e0: 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72  -journal if ther
b4f0: 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20  e exists one.** 
b500: 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76  or more open sav
b510: 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63  epoints for whic
b520: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  h:.**.**   * The
b530: 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20   page-number is 
b540: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
b550: 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70  al to PagerSavep
b560: 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a  oint.nOrig, and.
b570: 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63  **   * The bit c
b580: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
b590: 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  the page-number 
b5a0: 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a  is not set in.**
b5b0: 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
b5c0: 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
b5d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b5e0: 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
b5f0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
b600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
b610: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
b620: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
b630: 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
b640: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74  pPg->pgno;.  int
b650: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b660: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
b670: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  int; i++){.    p
b680: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
b690: 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69  epoint[i];.    i
b6a0: 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e  f( p->nOrig>=pgn
b6b0: 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42  o && 0==sqlite3B
b6c0: 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c  itvecTestNotNull
b6d0: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
b6e0: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
b6f0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
b700: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
b710: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
b720: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65  E_DEBUG./*.** Re
b730: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
b740: 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
b750: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b760: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b770: 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  int pageInJourna
b780: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
b790: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
b7a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
b7b0: 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
b7c0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
b7d0: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69  ->pgno);.}.#endi
b7e0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
b7f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b800: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b820: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b830: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b840: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b860: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b870: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b880: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b890: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b8a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b8b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b8c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b8d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b8e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b8f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b900: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b910: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b920: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b930: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b940: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b950: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b960: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b970: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b980: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b990: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b9a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b9b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b9c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b9d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b9e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b9f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
ba00: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
ba10: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
ba20: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
ba30: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
ba40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
ba50: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
ba60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
ba70: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
ba80: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
ba90: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
baa0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
bab0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
bac0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
bad0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
bae0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
baf0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
bb00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
bb10: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
bb20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
bb30: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
bb40: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
bb50: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
bb60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
bb70: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
bb80: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
bb90: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
bba0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
bbb0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
bbc0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
bbd0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
bbe0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
bbf0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
bc00: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
bc10: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
bc20: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
bc30: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bc40: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bc50: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bc60: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bc70: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
bc80: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
bc90: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
bca0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
bcb0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
bcc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bcd0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
bce0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
bcf0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
bd00: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
bd10: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
bd20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bd30: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
bd40: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
bd50: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
bd60: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
bd70: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
bd80: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
bd90: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
bda0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
bdb0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
bdc0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
bdd0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
bde0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
bdf0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
be00: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
be10: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
be20: 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b  = pPager->noLock
be30: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73   ? SQLITE_OK : s
be40: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
be50: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be60: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
be70: 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  r->eLock!=UNKNOW
be80: 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  N_LOCK ){.      
be90: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
bea0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d  (u8)eLock;.    }
beb0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
bec0: 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  NLOCK %p %d\n", 
bed0: 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a  pPager, eLock)).
bee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
bef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
bf00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bf10: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
bf20: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
bf30: 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43  ither SHARED_LOC
bf40: 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c  K,.** RESERVED_L
bf50: 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45  OCK or EXCLUSIVE
bf60: 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61  _LOCK. If the ca
bf70: 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66  ller is successf
bf80: 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50  ul, set the.** P
bf90: 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61  ager.eLock varia
bfa0: 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c  ble to the new l
bfb0: 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a  ocking state. .*
bfc0: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
bfd0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
bfe0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
bff0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
c000: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c  ction is .** cal
c010: 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69  led, do not modi
c020: 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65  fy it unless the
c030: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
c040: 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f  te is EXCLUSIVE_
c050: 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68  LOCK. .** See th
c060: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
c070: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55  the #define of U
c080: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
c090: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a  an explanation .
c0a0: 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  ** of this..*/.s
c0b0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c  tatic int pagerL
c0c0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
c0d0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
c0e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c0f0: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
c100: 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ( eLock==SHARED_
c110: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52  LOCK || eLock==R
c120: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
c130: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c140: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
c150: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f  Pager->eLock<eLo
c160: 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  ck || pPager->eL
c170: 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
c180: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
c190: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
c1a0: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
c1b0: 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
c1c0: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
c1d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c1e0: 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65  OK && (pPager->e
c1f0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c200: 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  CK||eLock==EXCLU
c210: 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  SIVE_LOCK) ){.  
c220: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63      pPager->eLoc
c230: 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20  k = (u8)eLock;. 
c240: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
c250: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c260: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c270: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c280: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
c290: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
c2a0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
c2b0: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
c2c0: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
c2d0: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
c2e0: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
c2f0: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
c300: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
c310: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
c320: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
c330: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
c340: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
c350: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
c360: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
c370: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
c380: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
c390: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
c3a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
c3b0: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
c3c0: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
c3d0: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
c3e0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
c3f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74  e..**.** The opt
c400: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73  imization is als
c410: 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64  o always enabled
c420: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
c430: 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61  iles. It is.** a
c440: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
c450: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
c460: 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65   pPager is opene
c470: 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d on an in-memor
c480: 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a  y.** database..*
c490: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
c4a0: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
c4b0: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
c4c0: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
c4d0: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
c4e0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
c4f0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
c500: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c510: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
c520: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
c530: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
c540: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
c550: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c560: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
c570: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
c580: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
c590: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
c5a0: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
c5b0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
c5c0: 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
c5d0: 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20  int dc;         
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5f0: 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72    /* Device char
c600: 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20  acteristics */. 
c610: 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20     int nSector; 
c620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c630: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73       /* Sector s
c640: 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ize */.    int s
c650: 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  zPage;          
c660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c670: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  Page size */..  
c680: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
c690: 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
c6a0: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
c6b0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c6c0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
c6d0: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
c6e0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
c6f0: 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67  rSize;.    szPag
c700: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
c710: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
c720: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
c730: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
c740: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
c750: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c760: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
c770: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
c780: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
c790: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
c7a0: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
c7b0: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
c7c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
c7d0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
c7e0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
c7f0: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
c800: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c810: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
c820: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
c830: 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  x) 0.#endif../*.
c840: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
c850: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
c860: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
c870: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
c880: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
c890: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
c8a0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
c8b0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
c8c0: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
c8d0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
c8e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c8f0: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
c900: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
c910: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
c920: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
c930: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
c940: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
c950: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
c960: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
c970: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
c980: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
c990: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
c9a0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
c9b0: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
c9c0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
c9d0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
c9e0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
c9f0: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
ca00: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
ca10: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
ca20: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
ca30: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
ca40: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
ca50: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
ca60: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
ca70: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
ca80: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
ca90: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
caa0: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
cab0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
cac0: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
cad0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
cae0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
caf0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cb00: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
cb10: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
cb20: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
cb30: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
cb40: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
cb50: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
cb60: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
cb70: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
cb80: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
cb90: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
cba0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
cbb0: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
cbc0: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
cbd0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
cbe0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
cbf0: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
cc00: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
cc10: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
cc20: 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
cc30: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
cc40: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
cc50: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
cc60: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
cc70: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
cc80: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
cc90: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
cca0: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
ccb0: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  (X)  0.#define p
ccc0: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
ccd0: 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45  h(X).#define CHE
cce0: 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69  CK_PAGE(x).#endi
ccf0: 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45  f  /* SQLITE_CHE
cd00: 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a  CK_PAGES */../*.
cd10: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
cd20: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
cd30: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
cd40: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
cd50: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66   open..** This f
cd60: 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
cd70: 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65   to read a maste
cd80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd90: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ame from the .**
cda0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
cdb0: 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73   and, if success
cdc0: 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69  ful, copies it i
cdd0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c  nto memory suppl
cde0: 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63  ied .** by the c
cdf0: 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65  aller. See comme
ce00: 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d  nts above writeM
ce10: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
ce20: 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a  or the format.**
ce30: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61   used to store a
ce40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce50: 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65  file name at the
ce60: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
ce70: 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d  l file..**.** zM
ce80: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
ce90: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
cea0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
ceb0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
cec0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
ced0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
cee0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
cef0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
cf00: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
cf10: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
cf20: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
cf30: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
cf40: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
cf50: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
cf60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
cf70: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
cf80: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
cf90: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
cfa0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
cfb0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
cfc0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
cfd0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
cfe0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
cff0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
d000: 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72  *.** If a master
d010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d020: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74  me is present at
d030: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d040: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c  journal.** file,
d050: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
d060: 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  ed into the buff
d070: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
d080: 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e   zMaster. A.** n
d090: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
d0a0: 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  te is appended t
d0b0: 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c  o the buffer fol
d0c0: 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65  lowing the maste
d0d0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r.** journal fil
d0e0: 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e name..**.** If
d0f0: 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65   it is determine
d100: 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72  d that no master
d110: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d120: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a  me is present .*
d130: 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20  * zMaster[0] is 
d140: 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
d150: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
d160: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
d170: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
d180: 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
d190: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
d1a0: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f  n SQLite.** erro
d1b0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
d1c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
d1d0: 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  t readMasterJour
d1e0: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  nal(sqlite3_file
d1f0: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a   *pJrnl, char *z
d200: 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73  Master, u32 nMas
d210: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
d240: 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20  e */.  u32 len; 
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62    /* Length in b
d270: 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ytes of master j
d280: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
d290: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d2b0: 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74  otal size in byt
d2c0: 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  es of journal fi
d2d0: 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33  le pJrnl */.  u3
d2e0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
d2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63           /* MJ c
d300: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65  hecksum value re
d310: 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ad from journal 
d320: 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
d350: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e   counter */.  un
d360: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
d370: 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75  ic[8];   /* A bu
d380: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
d390: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
d3a0: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
d3b0: 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c  '\0';..  if( SQL
d3c0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
d3d0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
d3e0: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20  pJrnl, &szJ)).  
d3f0: 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c   || szJ<16.   ||
d400: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d410: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
d420: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
d430: 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d  )).   || len>=nM
d440: 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e  aster .   || len
d450: 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ==0 .   || SQLIT
d460: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
d470: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
d480: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
d490: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d4a0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
d4b0: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
d4c0: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
d4d0: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
d4e0: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
d4f0: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
d500: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d510: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
d520: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
d530: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
d540: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
d550: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
d560: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
d570: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
d580: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
d590: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
d5a0: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
d5b0: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
d5c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
d5d0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
d5e0: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
d5f0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
d600: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
d610: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
d620: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
d630: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
d640: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
d650: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
d660: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
d670: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
d680: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
d690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
d6a0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
d6b0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
d6c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
d6d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
d6e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
d6f0: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
d700: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
d710: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d720: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
d730: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
d740: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
d750: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
d760: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
d770: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
d780: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
d790: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
d7a0: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
d7b0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
d7c0: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
d7d0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
d7e0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
d7f0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
d800: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
d810: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
d820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d840: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d880: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
d8b0: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
d8c0: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
d8d0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
d8e0: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
d8f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
d900: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
d910: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
d920: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
d930: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
d940: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
d950: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d960: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
d970: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d980: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
d990: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
d9a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d9b0: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
d9c0: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
d9d0: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
d9e0: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
d9f0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
da00: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
da10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
da20: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
da30: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
da40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
da50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
da60: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
da70: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
da80: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
da90: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
daa0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
dab0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
dac0: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
dad0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
daf0: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
db00: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
db10: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
db20: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
db30: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
db40: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
db50: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
db60: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
db70: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
db80: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
db90: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
dba0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
dbb0: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
dbc0: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
dbd0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
dbe0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
dbf0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
dc00: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
dc10: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
dc20: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
dc30: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
dc40: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
dc50: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
dc60: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
dc70: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
dc80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
dc90: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
dca0: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
dcb0: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
dcc0: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
dcd0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
dce0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
dcf0: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
dd00: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
dd10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
dd20: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
dd30: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
dd40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
dd50: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
dd60: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
dd70: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
dd80: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
dd90: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
dda0: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
ddb0: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
ddc0: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
ddd0: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
dde0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
ddf0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
de00: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
de10: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
de20: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
de30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
de40: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
de70: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
de80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
de90: 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  jfd) );.  assert
dea0: 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ( !sqlite3Journa
deb0: 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67  lIsInMemory(pPag
dec0: 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66  er->jfd) );.  if
ded0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
dee0: 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73  lOff ){.    cons
def0: 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70  t i64 iLimit = p
df00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
df10: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c  zeLimit;    /* L
df20: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73  ocal cache of js
df30: 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43  l */..    IOTRAC
df40: 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c  E(("JZEROHDR %p\
df50: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
df60: 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20   if( doTruncate 
df70: 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a  || iLimit==0 ){.
df80: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
df90: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
dfa0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
dfb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
dfc0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
dfd0: 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b   zeroHdr[28] = {
dfe0: 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0};.      rc = s
dff0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
e000: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48  ager->jfd, zeroH
e010: 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48  dr, sizeof(zeroH
e020: 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  dr), 0);.    }. 
e030: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
e040: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
e050: 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
e060: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
e070: 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
e080: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54   SQLITE_SYNC_DAT
e090: 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79  AONLY|pPager->sy
e0a0: 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  ncFlags);.    }.
e0b0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
e0c0: 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61  point the transa
e0d0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
e0e0: 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65  ed but the write
e0f0: 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73   lock .    ** is
e100: 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
e110: 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
e120: 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69  e is a size limi
e130: 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  t configured for
e140: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72   .    ** the per
e150: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
e160: 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
e170: 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
e180: 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20  onsumes more.   
e190: 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74   ** space than t
e1a0: 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73  hat limit allows
e1b0: 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69   for, truncate i
e1c0: 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20  t now. There is 
e1d0: 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74  no need.    ** t
e1e0: 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20  o sync the file 
e1f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f  following this o
e200: 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
e210: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e220: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74  ITE_OK && iLimit
e230: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  >0 ){.      i64 
e240: 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  sz;.      rc = s
e250: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
e260: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
e270: 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  z);.      if( rc
e280: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73  ==SQLITE_OK && s
e290: 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  z>iLimit ){.    
e2a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e2b0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
e2c0: 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b  r->jfd, iLimit);
e2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e2e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
e300: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
e310: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
e320: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
e330: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
e340: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
e350: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
e360: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
e370: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e380: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
e390: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
e3a0: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
e3b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
e3c0: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
e3d0: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
e3e0: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
e3f0: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
e400: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e410: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
e420: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
e430: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
e440: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
e450: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
e460: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
e470: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
e480: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
e490: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
e4a0: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
e4b0: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
e4c0: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
e4d0: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
e4e0: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20  s journal..** - 
e4f0: 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73  4 bytes: Databas
e500: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
e510: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
e520: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
e530: 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75  - 28) bytes of u
e540: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
e550: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
e560: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e570: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
e580: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e5b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64  */.  char *zHead
e5c0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
e5d0: 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70  pSpace;  /* Temp
e5e0: 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64  orary space used
e5f0: 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72   to build header
e600: 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65   */.  u32 nHeade
e610: 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d  r = (u32)pPager-
e620: 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a  >pageSize;/* Siz
e630: 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e  e of buffer poin
e640: 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65  ted to by zHeade
e650: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74  r */.  u32 nWrit
e660: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
e680: 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65  tes of header se
e690: 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ctor written */.
e6a0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
e6d0: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  unter */..  asse
e6e0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e6f0: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
e700: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
e710: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
e720: 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e  ..  if( nHeader>
e730: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
e740: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48  Pager) ){.    nH
e750: 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f  eader = JOURNAL_
e760: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
e770: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
e780: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
e790: 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79  vepoints and any
e7a0: 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72   of them were cr
e7b0: 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63  eated .  ** sinc
e7c0: 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  e the most recen
e7d0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
e7e0: 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70   was written, up
e7f0: 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  date the .  ** P
e800: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
e810: 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20  drOffset fields 
e820: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  now..  */.  for(
e830: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
e840: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
e850: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  +){.    if( pPag
e860: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
e870: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30  i].iHdrOffset==0
e880: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
e890: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
e8a0: 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50  .iHdrOffset = pP
e8b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e8c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e8d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
e8e0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
e8f0: 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c  nalOff = journal
e900: 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
e910: 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57  );..  /* .  ** W
e920: 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69  rite the nRec Fi
e930: 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72  eld - the number
e940: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
e950: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69   that follow thi
e960: 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  s.  ** journal h
e970: 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  eader. Normally,
e980: 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e   zero is written
e990: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61   to this value a
e9a0: 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a  t this time..  *
e9b0: 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f  * After the reco
e9c0: 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  rds are added to
e9d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e   the journal (an
e9e0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79  d the journal sy
e9f0: 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69  nced, .  ** if i
ea00: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
ea10: 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f  ), the zero is o
ea20: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
ea30: 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a  the true number.
ea40: 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20    ** of records 
ea50: 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  (see syncJournal
ea60: 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ())..  **.  ** A
ea70: 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74   faster alternat
ea80: 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20  ive is to write 
ea90: 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68  0xFFFFFFFF to th
eaa0: 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68  e nRec field. Wh
eab0: 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  en.  ** reading 
eac0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  the journal this
ead0: 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c   value tells SQL
eae0: 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68  ite to assume th
eaf0: 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74  at the.  ** rest
eb00: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
eb10: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61  file contains va
eb20: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
eb30: 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f  . This assumptio
eb40: 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72  n.  ** is danger
eb50: 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69  ous, as if a fai
eb60: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
eb70: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
eb80: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
eb90: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
eba0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
ebb0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
ebc0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
ebd0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
ebe0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
ebf0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
ec00: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
ec10: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
ec20: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
ec30: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
ec40: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
ec50: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
ec60: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
ec70: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ec80: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
ec90: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
eca0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
ecb0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
ecc0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
ecd0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
ece0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
ecf0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
ed00: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ed10: 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
ed20: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a  ager->noSync );.
ed30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
ed40: 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d  Sync || (pPager-
ed50: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ed60: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ed70: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
ed80: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
ed90: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
eda0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
edb0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
edc0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
edd0: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
ede0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
edf0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
ee00: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
ee10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ee20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ee30: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
ee40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
ee50: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
ee60: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
ee70: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
ee80: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
ee90: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
eea0: 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c  alizer */ .  sql
eeb0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
eec0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
eed0: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
eee0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
eef0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ef00: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ef10: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
ef20: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
ef30: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
ef40: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
ef50: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ef60: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ef70: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ef80: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
ef90: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
efa0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
efb0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
efc0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
efd0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
efe0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eff0: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
f000: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
f010: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
f020: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
f030: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f040: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f050: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
f060: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
f070: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
f080: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
f090: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
f0a0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
f0b0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
f0c0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
f0d0: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
f0e0: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
f0f0: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
f100: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
f110: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
f120: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
f130: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
f140: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
f150: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
f160: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
f170: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f180: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
f190: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
f1a0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
f1b0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
f1c0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
f1d0: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
f1e0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
f1f0: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
f200: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
f210: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
f220: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
f230: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
f240: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
f250: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
f260: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
f270: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
f280: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
f290: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
f2a0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
f2b0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
f2c0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
f2d0: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
f2e0: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
f2f0: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
f300: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
f310: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
f320: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
f330: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
f340: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
f350: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
f360: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
f370: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
f380: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
f390: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
f3a0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
f3b0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
f3c0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
f3d0: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
f3e0: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
f3f0: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
f400: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
f410: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
f420: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
f430: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
f440: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
f450: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
f460: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
f470: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
f480: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
f490: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
f4a0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
f4b0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
f4c0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
f4d0: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
f4e0: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
f4f0: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
f500: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
f510: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
f520: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
f530: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
f540: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
f550: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
f560: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
f570: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
f580: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
f590: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
f5a0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
f5b0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
f5c0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
f5d0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
f5e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
f5f0: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
f600: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
f610: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
f620: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
f630: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f640: 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72  lOff);.    asser
f650: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
f660: 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
f670: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20  >journalOff );. 
f680: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
f690: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
f6a0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f6b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
f6c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
f6d0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
f6e0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
f6f0: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
f700: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
f710: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
f720: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
f730: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
f740: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
f750: 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75  .** file. The cu
f760: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
f770: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
f780: 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  le is given by.*
f790: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
f7a0: 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  lOff. See commen
f7b0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
f7c0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
f7d0: 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73  r() for.** a des
f7e0: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
f7f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
f800: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
f810: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
f820: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
f830: 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74   *pNRec is set t
f840: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
f850: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
f860: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
f870: 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69  eader and *pDbSi
f880: 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
f890: 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
f8a0: 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
f8b0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
f8c0: 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e  began, in pages.
f8d0: 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63   Also, pPager->c
f8e0: 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73  ksumInit.** is s
f8f0: 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
f900: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f910: 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51  urnal header. SQ
f920: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
f930: 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ned.** in this c
f940: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
f950: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f960: 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f   file appears to
f970: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53   be corrupted, S
f980: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a  QLITE_DONE is.**
f990: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
f9a0: 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a  NRec and *PDbSiz
f9b0: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
f9c0: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
f9d0: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
f9e0: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
f9f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fa00: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
fa10: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
fa20: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
fa30: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
fa40: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
fa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
fa60: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
fa70: 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20  nt isHot,.  i64 
fa80: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
fa90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
faa0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
fab0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
fac0: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
fad0: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
fae0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
faf0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fb00: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
fb10: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb30: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
fb40: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
fb50: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
fb60: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
fb90: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
fba0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
fbb0: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
fbc0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
fbd0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
fbe0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
fbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
fc00: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
fc10: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
fc20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
fc30: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
fc40: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
fc50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
fc60: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
fc70: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
fc80: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
fc90: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
fca0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
fcb0: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
fcc0: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
fcd0: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
fce0: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
fcf0: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
fd00: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
fd10: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
fd20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
fd30: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
fd40: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
fd50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
fd60: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
fd70: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
fd80: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
fd90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fda0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
fdb0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
fdc0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
fdd0: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
fde0: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
fdf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fe00: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
fe10: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
fe20: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
fe30: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
fe40: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
fe50: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
fe60: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
fe70: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
fe80: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
fe90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
fea0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
feb0: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
fec0: 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64  if( isHot || iHd
fed0: 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  rOff!=pPager->jo
fee0: 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20  urnalHdr ){.    
fef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
ff00: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
ff10: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
ff20: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
ff30: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
ff40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
ff50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
ff60: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
ff70: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
ff80: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
ff90: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ffa0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
ffb0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61   }.  }..  /* Rea
ffc0: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
ffd0: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
ffe0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
fff0: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
10000 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
10010 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
10020 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
10030 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
10040 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
10050 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
10060 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
10070 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
10080 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
10090 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
100a0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
100b0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
100c0 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
100d0 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
100e0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
100f0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10100 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
10110 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
10120 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
10130 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
10140 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10150 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
10160 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
10170 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10180 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
10190 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
101a0 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
101b0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
101c0 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
101d0 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
101e0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
101f0 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
10200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10210 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10220 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10230 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65  er */..    /* Re
10240 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  ad the page-size
10250 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10260 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10270 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69  fields. */.    i
10280 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
10290 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
102a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
102b0 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72  Off+20, &iSector
102c0 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53  Size)).     || S
102d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
102e0 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
102f0 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
10300 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29  24, &iPageSize))
10310 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
10320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
10330 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20      /* Versions 
10340 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
10350 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65  to 3.5.8 set the
10360 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   page-size field
10370 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   of the.    ** j
10380 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
10390 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63   zero. In this c
103a0 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ase, assume that
103b0 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53   the Pager.pageS
103c0 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61  ize.    ** varia
103d0 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ble is already s
103e0 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  et to the correc
103f0 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20  t page size..   
10400 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10410 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eSize==0 ){.    
10420 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50    iPageSize = pP
10430 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
10440 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
10450 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c  eck that the val
10460 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ues read from th
10470 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
10480 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  sector-size fiel
10490 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69  ds.    ** are wi
104a0 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62  thin range. To b
104b0 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f  e 'in range', bo
104c0 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74  th values need t
104d0 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20  o be a power.   
104e0 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74   ** of two great
104f0 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
10500 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61   to 512 or 32, a
10510 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74  nd not greater t
10520 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a  han their .    *
10530 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d  * respective com
10540 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75  pile time maximu
10550 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f  m limits..    */
10560 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69  .    if( iPageSi
10570 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20  ze<512          
10580 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74          || iSect
10590 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c  orSize<32.     |
105a0 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
105b0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
105c0 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
105d0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
105e0 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
105f0 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
10600 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
10610 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
10620 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
10630 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
10640 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
10650 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
10660 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
10670 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
10680 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
10690 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
106a0 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
106b0 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
106c0 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
106d0 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
106e0 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
106f0 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
10700 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
10710 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
10720 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10730 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
10740 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10750 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
10760 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10770 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
10780 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
10790 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
107a0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
107b0 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
107c0 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
107d0 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
107e0 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
107f0 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
10800 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
10810 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
10820 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10830 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
10840 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20  er, &iPageSize, 
10850 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
10860 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
10870 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   );..    /* Upda
10880 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
10890 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
108a0 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
108b0 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68  ed by .    ** th
108c0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
108d0 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
108e0 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
108f0 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20  rnal was.    ** 
10900 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
10910 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
10920 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
10930 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  his routine.    
10940 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
10950 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
10960 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
10970 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
10980 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  .    ** of Pager
10990 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
109a0 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
109b0 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
109c0 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ne..    */.    p
109d0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
109e0 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  e = iSectorSize;
109f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
10a00 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
10a10 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10a20 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
10a30 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  c;.}.../*.** Wri
10a40 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
10a50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10a60 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
10a70 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
10a80 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
10a90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
10aa0 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
10ab0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
10ac0 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
10ad0 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
10ae0 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
10af0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
10b00 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
10b10 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
10b20 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10b30 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
10b40 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
10b50 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
10b60 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
10b70 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
10b80 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
10b90 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50  *   + 4 bytes: P
10ba0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
10bb0 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61     + N bytes: Ma
10bc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10bd0 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a  ename in utf-8..
10be0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10bf0 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  N (length of mas
10c00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10c10 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75   in bytes, no nu
10c20 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a  l-terminator)..*
10c30 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  *   + 4 bytes: M
10c40 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10c50 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
10c60 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f    + 8 bytes: aJo
10c70 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
10c80 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
10c90 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
10ca0 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
10cb0 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
10cc0 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
10cd0 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72  urnal name, wher
10ce0 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69  e each byte is i
10cf0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
10d00 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74  signed 8-bit int
10d10 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  eger..**.** If z
10d20 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c  Master is a NULL
10d30 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73   pointer (occurs
10d40 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61   for a single da
10d50 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
10d60 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61  on), .** this ca
10d70 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ll is a no-op..*
10d80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
10d90 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
10da0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
10db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
10dc0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10df0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
10e00 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20  nMaster;        
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67  Length of string
10e30 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36   zMaster */.  i6
10e40 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e60 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
10e70 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69  er in journal fi
10e80 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c  le */.  i64 jrnl
10e90 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
10ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10eb0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
10ec0 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33   on disk */.  u3
10ed0 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20  2 cksum = 0;    
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ef0 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74  * Checksum of st
10f00 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
10f10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
10f20 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20  r->setMaster==0 
10f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  );.  assert( !pa
10f40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
10f50 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  ) );..  if( !zMa
10f60 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67  ster .   || pPag
10f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
10f80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
10f90 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c  DE_MEMORY .   ||
10fa0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
10fb0 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72  >jfd).  ){.    r
10fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10fd0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10fe0 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
10ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11000 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
11010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11020 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
11030 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
11040 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
11050 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
11060 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
11070 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
11080 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
11090 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
110a0 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
110b0 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
110c0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
110d0 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
110e0 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
110f0 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
11100 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
11110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
11120 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
11130 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
11140 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
11150 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
11160 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
11170 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
11180 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
11190 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
111a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
111b0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
111c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
111d0 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
111e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
111f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
11200 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
11210 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
11220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11230 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
11240 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
11250 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
11260 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
11270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
11280 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
11290 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
112a0 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
112b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
112c0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
112d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
112e0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
112f0 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
11300 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
11310 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
11320 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
11330 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
11340 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
11350 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
11360 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11370 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11380 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
11390 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
113a0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
113b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
113c0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
113d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
113e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61     iHdrOff+4+nMa
11410 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
11420 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11430 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
11440 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
11450 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
11460 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11470 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
11480 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
11490 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
114a0 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
114b0 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
114c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
114d0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
114e0 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
114f0 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
11500 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
11510 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
11520 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
11530 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
11540 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
11550 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
11560 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
11570 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
11580 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
11590 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
115a0 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
115b0 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
115c0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
115d0 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
115e0 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
115f0 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
11600 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
11610 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
11620 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
11630 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
11640 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
11650 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
11660 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
11670 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
11680 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
11690 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
116a0 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
116b0 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
116c0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
116d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
116e0 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
116f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11700 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69  Discard the enti
11710 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
11720 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  he in-memory pag
11730 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74  e-cache..*/.stat
11740 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
11750 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
11760 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44  r){.  pPager->iD
11770 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20  ataVersion++;.  
11780 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
11790 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
117a0 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ckup);.  sqlite3
117b0 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
117c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
117d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
117e0 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56  e pPager->iDataV
117f0 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a  ersion value.*/.
11800 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72  u32 sqlite3Pager
11810 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65  DataVersion(Page
11820 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
11830 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
11840 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20  tate>PAGER_OPEN 
11850 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
11860 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11870 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
11880 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69  all structures i
11890 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
118a0 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61  epoint[] array a
118b0 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50  nd set both.** P
118c0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
118d0 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70  and Pager.nSavep
118e0 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c  oint to zero. Cl
118f0 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ose the sub-jour
11900 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  nal.** if it is 
11910 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
11920 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
11930 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a  lusive mode..*/.
11940 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11950 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11970 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11980 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
11990 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67  ator for looping
119a0 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61   through Pager.a
119b0 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66  Savepoint */.  f
119c0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
119d0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
119e0 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  ii++){.    sqlit
119f0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11a00 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11a10 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  nt[ii].pInSavepo
11a20 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  int);.  }.  if( 
11a30 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
11a40 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65  veMode || sqlite
11a50 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
11a60 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  ry(pPager->sjfd)
11a70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
11a80 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
11a90 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
11aa0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
11ab0 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
11ac0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11ad0 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
11ae0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
11af0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
11b00 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
11b10 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
11b20 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
11b30 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
11b40 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
11b50 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
11b60 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
11b70 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11b80 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
11b90 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
11ba0 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
11bb0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
11bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
11bd0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
11be0 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
11bf0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11c00 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
11c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11c20 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
11c30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11c40 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
11c50 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
11c60 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11c70 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11c80 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
11c90 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
11ca0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11cb0 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
11cc0 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
11cd0 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
11ce0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
11cf0 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
11d00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
11d10 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
11d20 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
11d30 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
11d40 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
11d50 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
11d60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11d70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
11d80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11d90 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67  no-op if the pag
11da0 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
11db0 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a  ve mode and not.
11dc0 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ** in the ERROR 
11dd0 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
11de0 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68  , it switches th
11df0 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52  e pager to PAGER
11e00 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a  _OPEN.** state..
11e10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11e20 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63  er is not in exc
11e30 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
11e40 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  de, the database
11e50 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70   file is.** comp
11e60 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  letely unlocked.
11e70 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
11e80 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  unlocked and the
11e90 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65   file-system doe
11ea0 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74  s.** not exhibit
11eb0 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45   the UNDELETABLE
11ec0 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65  _WHEN_OPEN prope
11ed0 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rty, the journal
11ee0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73   file is.** clos
11ef0 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65  ed (if it is ope
11f00 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  n)..**.** If the
11f10 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52   pager is in ERR
11f20 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
11f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11f40 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63  alled, the .** c
11f50 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
11f60 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64  ager cache are d
11f70 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20  iscarded before 
11f80 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74  switching back t
11f90 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73  o .** the OPEN s
11fa0 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73  tate. Regardless
11fb0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
11fc0 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
11fd0 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72  usive-mode.** or
11fe0 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61   not, any journa
11ff0 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74  l file left in t
12000 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77  he file-system w
12010 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a  ill be treated.*
12020 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * as a hot-journ
12030 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
12040 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ck the next time
12050 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
12060 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64  ion.** is opened
12070 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20   (by this or by 
12080 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  any other connec
12090 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tion)..*/.static
120a0 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
120b0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
120c0 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
120d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
120e0 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20  GER_READER .    
120f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
12100 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
12110 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
12120 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
12130 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20  R_ERROR .  );.. 
12140 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
12150 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
12160 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
12170 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
12180 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c  = 0;.  releaseAl
12190 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
121a0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65  er);..  if( page
121b0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
121c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
121d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
121e0 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  fd) );.    sqlit
121f0 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e  e3WalEndReadTran
12200 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
12210 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  pWal);.    pPage
12220 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12230 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  R_OPEN;.  }else 
12240 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
12250 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
12260 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65  /* Error code re
12290 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55  turned by pagerU
122a0 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20  nlockDb() */.   
122b0 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65   int iDc = isOpe
122c0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71  n(pPager->fd)?sq
122d0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
122e0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
122f0 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20  ger->fd):0;..   
12300 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61   /* If the opera
12310 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70  ting system supp
12320 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20  ort deletion of 
12330 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e  open files, then
12340 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68  .    ** close th
12350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
12360 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65  hen dropping the
12370 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20   database lock. 
12380 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
12390 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  * another connec
123a0 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61  tion with journa
123b0 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69  l_mode=delete mi
123c0 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66  ght delete the f
123d0 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66  ile.    ** out f
123e0 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20  rom under us..  
123f0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
12400 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12410 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35  ODE_MEMORY   & 5
12420 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12430 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12440 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20  ALMODE_OFF      
12450 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12460 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12470 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20  URNALMODE_WAL   
12480 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12490 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
124a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
124b0 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b  ETE   & 5)!=1 );
124c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
124d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
124e0 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31  TRUNCATE & 5)==1
124f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12500 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
12510 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29  DE_PERSIST  & 5)
12520 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30  ==1 );.    if( 0
12530 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ==(iDc & SQLITE_
12540 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
12550 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20  E_WHEN_OPEN).   
12560 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d    || 1!=(pPager-
12570 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35  >journalMode & 5
12580 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
12590 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
125a0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
125b0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
125c0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
125d0 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
125e0 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c   the call to unl
125f0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12600 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69  .    ** file fai
12610 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72  ls, set the curr
12620 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e  ent lock to UNKN
12630 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68  OWN_LOCK. See th
12640 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a  e comment.    **
12650 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
12660 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c  ne for UNKNOWN_L
12670 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
12680 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68  nation of why th
12690 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63  is.    ** is nec
126a0 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
126b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c     rc = pagerUnl
126c0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f  ockDb(pPager, NO
126d0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
126e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
126f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12700 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a  =PAGER_ERROR ){.
12710 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
12720 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ock = UNKNOWN_LO
12730 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
12740 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74  * The pager stat
12750 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64  e may be changed
12760 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f   from PAGER_ERRO
12770 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  R to PAGER_OPEN 
12780 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68  here.    ** with
12790 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65  out clearing the
127a0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69   error code. Thi
127b0 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c  s is intentional
127c0 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20   - the error.   
127d0 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61   ** code is clea
127e0 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  red and the cach
127f0 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62  e reset in the b
12800 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20  lock below..    
12810 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
12820 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12830 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
12840 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
12850 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12860 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
12870 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12880 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
12890 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  N;.  }..  /* If 
128a0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
128b0 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
128c0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
128d0 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
128e0 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
128f0 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  w that there are
12900 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
12910 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
12920 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74  e pager,.  ** it
12930 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65   can safely move
12940 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f   back to PAGER_O
12950 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20  PEN state. This 
12960 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a  happens in both.
12970 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20    ** normal and 
12980 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e  exclusive-lockin
12990 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  g mode..  */.  a
129a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
129b0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
129c0 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
129d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
129e0 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Code ){.    if( 
129f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12a00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ==0 ){.      pag
12a10 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
12a20 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
12a30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12a40 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
12a50 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12a60 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73  R_OPEN;.    }els
12a70 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
12a80 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70 65  >eState = (isOpe
12a90 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 3f  n(pPager->jfd) ?
12aa0 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50 41   PAGER_OPEN : PA
12ab0 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20 20  GER_READER);.   
12ac0 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46 45   }.    if( USEFE
12ad0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
12ae0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
12af0 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
12b00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
12b10 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
12b20 4b 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  K;.    setGetter
12b30 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
12b40 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
12b50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
12b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12b70 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
12b80 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
12b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12ba0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12bb0 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12bc0 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12bd0 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12be0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12bf0 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12c10 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12c20 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12c30 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
12c40 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
12c50 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
12c60 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
12c70 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
12c80 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
12c90 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12ca0 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12cb0 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12cc0 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12cd0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12ce0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12cf0 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12d00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12d10 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12d20 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12d30 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
12d40 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
12d50 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
12d60 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
12d70 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
12d80 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
12d90 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12da0 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12db0 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12dc0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12dd0 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12de0 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12df0 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12e00 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12e10 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12e20 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12e30 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
12e40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12e50 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12e60 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
12e70 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
12e80 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
12e90 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12ea0 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12eb0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12ec0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12ed0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12ee0 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12ef0 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12f00 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12f10 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12f20 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12f30 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12f40 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12f50 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12f60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12f70 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12f80 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12f90 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12fa0 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12fb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12fc0 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12fd0 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12fe0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12ff0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
13000 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
13010 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
13020 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
13030 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
13040 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
13050 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
13060 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
13070 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
13080 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
13090 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
130a0 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
130b0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
130c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
130d0 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
130e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
130f0 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 65 74  R_ERROR;.    set
13100 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
13110 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ger);.  }.  retu
13120 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
13130 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
13140 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
13150 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a  r, Pgno nPage);.
13160 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72 69 74 65  ./*.** The write
13170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
13180 6e 20 6f 6e 20 70 50 61 67 65 72 20 69 73 20 62  n on pPager is b
13190 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 20 28  eing committed (
131a0 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a 2a 20 6f  bCommit==1).** o
131b0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 28 62  r rolled back (b
131c0 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a 2a 0a 2a  Commit==0)..**.*
131d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
131e0 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6c 6c   and only if all
131f0 20 64 69 72 74 79 20 70 61 67 65 73 20 73 68 6f   dirty pages sho
13200 75 6c 64 20 62 65 20 66 6c 75 73 68 65 64 20 74  uld be flushed t
13210 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 52 75  o disk..**.** Ru
13220 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  les:.**.**   *  
13230 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20 64 61 74  For non-TEMP dat
13240 61 62 61 73 65 73 2c 20 61 6c 77 61 79 73 20 73  abases, always s
13250 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ync to disk.  Th
13260 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 0a  is is necessary.
13270 2a 2a 20 20 20 20 20 20 66 6f 72 20 74 72 61 6e  **      for tran
13280 73 61 63 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  sactions to be d
13290 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  urable..**.**   
132a0 2a 20 20 53 79 6e 63 20 54 45 4d 50 20 64 61 74  *  Sync TEMP dat
132b0 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e 20 61 20  abase only on a 
132c0 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61 20 52 4f  COMMIT (not a RO
132d0 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20 74 68 65  LLBACK) when the
132e0 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   backing.**     
132f0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
13300 72 65 61 74 65 64 20 61 6c 72 65 61 64 79 20 28  reated already (
13310 76 69 61 20 61 20 73 70 69 6c 6c 20 6f 6e 20 70  via a spill on p
13320 61 67 65 72 53 74 72 65 73 73 28 29 29 20 61 6e  agerStress()) an
13330 64 0a 2a 2a 20 20 20 20 20 20 77 68 65 6e 20 74  d.**      when t
13340 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 72  he number of dir
13350 74 79 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ty pages in memo
13360 72 79 20 65 78 63 65 65 64 73 20 32 35 25 20 6f  ry exceeds 25% o
13370 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a 2a 20 20  f the total.**  
13380 20 20 20 20 63 61 63 68 65 20 73 69 7a 65 2e 0a      cache size..
13390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
133a0 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
133b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
133c0 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
133d0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
133e0 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  File==0 ) return
133f0 20 31 3b 0a 20 20 69 66 28 20 21 62 43 6f 6d 6d   1;.  if( !bComm
13400 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  it ) return 0;. 
13410 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
13420 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
13430 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28 73  n 0;.  return (s
13440 71 6c 69 74 65 33 50 43 61 63 68 65 50 65 72 63  qlite3PCachePerc
13450 65 6e 74 44 69 72 74 79 28 70 50 61 67 65 72 2d  entDirty(pPager-
13460 3e 70 50 43 61 63 68 65 29 3e 3d 32 35 29 3b 0a  >pPCache)>=25);.
13470 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
13480 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
13490 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
134a0 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
134b0 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
134c0 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
134d0 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
134e0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
134f0 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
13500 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
13510 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
13520 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
13530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
13540 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
13550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13560 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
13570 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
13580 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
13590 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
135a0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  action..** .** T
135b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
135c0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50  ever called in P
135d0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
135e0 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65  . If it is calle
135f0 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f  d.** in PAGER_NO
13600 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52  NE or PAGER_SHAR
13610 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  ED state and the
13620 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65   lock held is le
13630 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  ss.** exclusive 
13640 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20  than a RESERVED 
13650 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f  lock, it is a no
13660 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -op..**.** Other
13670 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
13680 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
13690 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
136a0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
136b0 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
136c0 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
136d0 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
136e0 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
136f0 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
13700 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
13710 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
13720 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
13730 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
13740 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
13750 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
13760 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
13770 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
13780 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
13790 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
137a0 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
137b0 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
137c0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
137d0 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
137e0 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
137f0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
13800 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
13810 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
13820 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
13830 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
13840 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
13850 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13860 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
13870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13880 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
13890 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
138a0 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
138b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
138c0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
138d0 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
138e0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
138f0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
13900 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
13910 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
13920 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
13930 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
13940 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
13950 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13960 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
13970 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
13980 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
13990 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
139a0 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
139b0 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
139c0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
139d0 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
139e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
139f0 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
13a00 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
13a10 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
13a20 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
13a30 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
13a40 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
13a50 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
13a60 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
13a70 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
13a80 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
13a90 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
13aa0 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
13ab0 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
13ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
13ad0 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
13ae0 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
13af0 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
13b00 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
13b10 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
13b20 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
13b30 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
13b40 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
13b50 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
13b60 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
13b70 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
13b80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13b90 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70  finalized, the p
13ba0 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
13bb0 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
13bc0 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20  ..** If running 
13bd0 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
13be0 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20   rollback mode, 
13bf0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
13c00 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e  file is .** down
13c10 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52  graded to a SHAR
13c20 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  ED_LOCK..**.** S
13c30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
13c40 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
13c50 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
13c60 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
13c70 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
13c80 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
13c90 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
13ca0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
13cb0 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
13cc0 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
13cd0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
13ce0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
13cf0 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
13d00 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
13d10 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13d20 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
13d30 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
13d40 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
13d50 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13d60 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
13d70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13d80 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
13d90 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
13da0 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
13db0 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
13dc0 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
13dd0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
13de0 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
13df0 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
13e00 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
13e10 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
13e20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13e30 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13e40 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
13e50 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 2c  , int hasMaster,
13e60 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
13e70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13e80 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72  _OK;      /* Err
13e90 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75  or code from jou
13ea0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
13eb0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
13ec0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
13ed0 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72  E_OK;     /* Err
13ee0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20  or code from db 
13ef0 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  file unlock oper
13f00 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44  ation */..  /* D
13f10 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68 65  o nothing if the
13f20 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
13f30 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
13f40 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  te transaction. 
13f50 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74 20   ** or at least 
13f60 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
13f70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
13f80 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ay be called whe
13f90 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  n there.  ** is 
13fa0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
13fb0 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74 20  tion active but 
13fc0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
13fd0 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20 20  eater lock is.  
13fe0 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74 77  ** held under tw
13ff0 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
14000 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e 20  .  **.  **   1. 
14010 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66  After a successf
14020 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ul hot-journal r
14030 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 63  ollback, it is c
14040 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a 20  alled with.  ** 
14050 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41 47       eState==PAG
14060 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f 63  ER_NONE and eLoc
14070 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14080 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  K..  **.  **   2
14090 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69 6f  . If a connectio
140a0 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d  n with locking_m
140b0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68 6f  ode=exclusive ho
140c0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
140d0 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c 6f  VE .  **      lo
140e0 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63 6b  ck switches back
140f0 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   to locking_mode
14100 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65 6e  =normal and then
14110 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a 2a   executes a.  **
14120 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e 73        read-trans
14130 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75 6e  action, this fun
14140 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
14150 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41 47  with eState==PAG
14160 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a 20  ER_READER .  ** 
14170 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d       and eLock==
14180 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 77  EXCLUSIVE_LOCK w
14190 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72 61  hen the read-tra
141a0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
141b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
141c0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
141d0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
141e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
141f0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14200 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28 20  _ERROR );.  if( 
14210 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
14220 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
14230 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  ED && pPager->eL
14240 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f 43  ock<RESERVED_LOC
14250 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
14260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14270 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
14280 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
14290 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
142a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
142b0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
142c0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  nal==0 );.  if( 
142d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
142e0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
142f0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
14300 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
14310 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65 20  /* Finalize the 
14320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
14330 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14340 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72  JournalIsInMemor
14350 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  y(pPager->jfd) )
14360 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  {.      /* asser
14370 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
14380 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14390 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
143a0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c   ); */.      sql
143b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
143c0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
143d0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
143e0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
143f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
14400 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20  RUNCATE ){.     
14410 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14420 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
14430 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14440 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  E_OK;.      }els
14450 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14460 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
14470 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
14480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
144a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
144b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
144c0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
144d0 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20  ew file size is 
144e0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
144f0 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77 61   inode right awa
14500 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y..          ** 
14510 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a 6f  Otherwise the jo
14520 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73 75  urnal might resu
14530 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20  rrect following 
14540 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64  a power loss and
14550 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
14560 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72 61  use the last tra
14570 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c  nsaction to roll
14580 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20 20   back.  See.    
14590 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f        ** https:/
145a0 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c  /bugzilla.mozill
145b0 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63  a.org/show_bug.c
145c0 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20 20  gi?id=1072773.  
145d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
145e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
145f0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
14600 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
14610 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
14620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14640 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
14650 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
14660 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
14670 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
14680 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28  RSIST.      || (
14690 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
146a0 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
146b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
146c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
146d0 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  WAL).    ){.    
146e0 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e    rc = zeroJourn
146f0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61  alHdr(pPager, ha
14700 73 4d 61 73 74 65 72 7c 7c 70 50 61 67 65 72 2d  sMaster||pPager-
14710 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
14720 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14730 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
14740 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  lse{.      /* Th
14750 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65  is branch may be
14760 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50   executed with P
14770 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
14780 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20  ==MEMORY if.    
14790 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
147a0 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c  al was just roll
147b0 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ed back. In this
147c0 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
147d0 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  l.      ** file 
147e0 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
147f0 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66   and deleted. If
14800 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
14810 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20   writes to.     
14820 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
14830 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64   file, it will d
14840 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e  o so using an in
14850 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
14860 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14870 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21 70  int bDelete = !p
14880 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
14890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
148a0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
148b0 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
148c0 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  jfd)==0 );.     
148d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
148e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
148f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14900 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20 20  DELETE .        
14910 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
14920 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14930 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
14940 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
14950 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14960 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14970 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
14980 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14990 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
149a0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
149b0 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a   if( bDelete ){.
149c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
149d0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
149e0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
149f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
14a00 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b  ger->extraSync);
14a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14a20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
14a30 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
14a40 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
14a50 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
14a60 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
14a70 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
14a80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
14a90 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
14aa0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
14ab0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14ac0 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
14ad0 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67   *p = sqlite3Pag
14ae0 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
14af0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   1);.    if( p )
14b00 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48  {.      p->pageH
14b10 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ash = 0;.      s
14b20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
14b30 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20  NotNull(p);.    
14b40 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
14b50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
14b60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
14b70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
14b80 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
14b90 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
14ba0 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  ec = 0;.  if( rc
14bb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14bc0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
14bd0 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d  pagerFlushOnComm
14be0 69 74 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d  it(pPager, bComm
14bf0 69 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  it) ){.      sql
14c00 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
14c10 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
14c20 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  he);.    }else{.
14c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
14c40 63 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65  cheClearWritable
14c50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14c60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14c70 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
14c80 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
14c90 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
14ca0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ze);.  }..  if( 
14cb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14cc0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
14cd0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14ce0 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14cf0 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14d00 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14d10 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14d20 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14d30 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14d40 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
14d50 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
14d60 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
14d80 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
14d90 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
14da0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
14db0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
14dc0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
14dd0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14de0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14df0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14e00 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14e10 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14e20 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14e30 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14e40 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
14e50 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
14e60 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
14e70 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
14e80 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
14e90 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
14ea0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
14eb0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
14ec0 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
14ed0 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14ee0 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14ef0 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14f00 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14f10 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14f20 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14f30 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14f40 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
14f50 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
14f60 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
14f70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
14f80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14f90 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
14fa0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
14fb0 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
14fc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
14fd0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14fe0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14ff0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
15000 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
15010 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
15020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15030 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
15040 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
15050 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15060 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
15070 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
15080 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
15090 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
150a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
150b0 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
150c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
150d0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
150e0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
150f0 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
15100 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
15110 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
15120 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
15130 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
15140 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
15150 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
15160 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
15170 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
15180 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
15190 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
151a0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
151b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
151c0 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
151d0 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
151e0 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
151f0 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
15200 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
15210 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
15220 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
15230 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
15240 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
15250 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
15260 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
15270 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
15280 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
15290 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
152a0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
152b0 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
152c0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
152d0 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
152e0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
152f0 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
15300 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
15310 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
15320 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
15330 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
15340 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
15350 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
15360 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
15370 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
15380 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
15390 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
153a0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
153b0 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
153c0 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
153d0 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
153e0 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
153f0 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
15400 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
15410 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
15420 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
15430 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15440 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
15450 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
15460 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
15470 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
15480 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
15490 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
154a0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
154b0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
154c0 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
154d0 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
154e0 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
154f0 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
15500 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
15510 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
15520 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
15530 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15540 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
15550 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
15560 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
15570 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
15580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
15590 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
155a0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
155b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
155c0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
155d0 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
155e0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
155f0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
15600 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
15610 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
15620 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
15630 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
15640 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
15650 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
15660 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
15670 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
15680 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
15690 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
156a0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
156b0 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
156c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
156d0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
156e0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
156f0 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
15700 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
15710 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
15720 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
15730 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
15740 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
15750 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
15760 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
15770 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
15780 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
15790 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
157a0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
157b0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
157c0 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
157d0 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
157e0 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
157f0 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
15800 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
15810 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
15820 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
15830 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
15840 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
15850 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
15860 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
15870 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
15880 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
15890 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
158a0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
158b0 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
158c0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
158d0 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
158e0 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
158f0 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
15900 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
15910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15920 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
15930 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
15940 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
15950 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
15960 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
15970 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
15980 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
15990 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
159a0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
159b0 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
159c0 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
159d0 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
159e0 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
159f0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
15a00 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
15a10 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
15a20 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
15a30 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
15a40 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
15a50 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
15a60 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
15a70 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
15a80 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
15a90 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
15aa0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
15ab0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
15ac0 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
15ad0 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
15ae0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
15af0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15b00 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
15b10 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
15b20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15b30 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
15b40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15b50 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
15b60 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
15b70 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
15b80 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
15b90 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
15ba0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
15bb0 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
15bc0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
15bd0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15be0 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15bf0 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15c00 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15c10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15c20 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15c30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15c40 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
15c50 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
15c60 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
15c70 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
15c80 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
15c90 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
15cc0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
15cd0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15ce0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15cf0 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15d00 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15d10 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15d20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
15d30 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
15d40 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
15d50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
15d60 73 65 72 76 65 64 20 62 69 74 73 20 69 73 20 74  served bits is t
15d70 68 65 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64  he same in the d
15d80 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61  estination.** pa
15d90 67 65 72 20 61 73 20 69 74 20 69 73 20 69 6e 20  ger as it is in 
15da0 74 68 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69  the source.  Thi
15db0 73 20 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20  s comes up when 
15dc0 61 20 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73  a VACUUM changes
15dd0 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
15de0 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
15df0 74 6f 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22  to the "optimal"
15e00 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64   amount..*/.void
15e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69   sqlite3PagerAli
15e20 67 6e 52 65 73 65 72 76 65 28 50 61 67 65 72 20  gnReserve(Pager 
15e30 2a 70 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70  *pDest, Pager *p
15e40 53 72 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73  Src){.  if( pDes
15e50 74 2d 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72  t->nReserve!=pSr
15e60 63 2d 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20  c->nReserve ){. 
15e70 20 20 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72     pDest->nReser
15e80 76 65 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65  ve = pSrc->nRese
15e90 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
15ea0 70 6f 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b  portSize(pDest);
15eb0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
15ec0 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
15ed0 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74  le page from eit
15ee0 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  her the journal 
15ef0 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a  file (if isMainJ
15f00 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72  rnl==1) or.** fr
15f10 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
15f20 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  al (if isMainJrn
15f30 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61  l==0) and playba
15f40 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a  ck that page..**
15f50 20 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73   The page begins
15f60 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66   at offset *pOff
15f70 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c  set into the fil
15f80 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a  e. The *pOffset.
15f90 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72  ** value is incr
15fa0 65 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61  eased to the sta
15fb0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  rt of the next p
15fc0 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
15fd0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  al..**.** The ma
15fe0 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
15ff0 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75  nal uses checksu
16000 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
16010 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
16020 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  .** not..**.** I
16030 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
16040 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
16050 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
16060 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
16070 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
16080 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
16090 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
160a0 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
160b0 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
160c0 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
160d0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
160e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
160f0 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
16100 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
16110 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
16120 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
16130 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
16140 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
16150 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
16160 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
16170 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
16180 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
16190 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
161a0 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
161b0 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
161c0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
161d0 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
161e0 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
161f0 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
16200 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
16210 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
16220 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
16230 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
16240 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
16250 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
16260 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
16270 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
16280 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16290 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
162a0 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
162b0 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
162c0 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
162d0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
162e0 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
162f0 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
16300 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
16310 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
16320 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
16330 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
16340 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
16350 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
16360 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
16370 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
16380 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
16390 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
163a0 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
163b0 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
163c0 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
163d0 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
163e0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
163f0 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
16400 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
16410 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
16420 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
16430 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
16440 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
16450 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
16460 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
16470 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
16480 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
16490 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
164a0 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
164b0 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
164c0 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
164d0 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
164e0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
164f0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
16500 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
16510 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
16520 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
16530 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
16540 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
16550 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
16560 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
16570 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
16580 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
16590 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
165a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
165b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
165c0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
165d0 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
165e0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
165f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16600 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
16610 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f  ack */.  i64 *pO
16620 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
16630 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
16640 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c   of record to pl
16650 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  ayback */.  Bitv
16660 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20  ec *pDone,      
16670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
16680 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
16690 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
166a0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
166b0 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
166c0 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
166d0 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
166e0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
166f0 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20   int isSavepnt  
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16710 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73 61 76  * True for a sav
16720 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
16730 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
16740 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
16770 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
16780 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
167b0 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
167c0 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
167d0 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
167f0 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
16800 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
16810 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ing */.  char *a
16820 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
16830 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
16840 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20  ary storage for 
16850 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71  the page */.  sq
16860 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b  lite3_file *jfd;
16870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16880 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
16890 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  or for the journ
168a0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
168b0 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20   isSynced;      
168c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
168d0 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61  ue if journal pa
168e0 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  ge is synced */.
168f0 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d 61  .  assert( (isMa
16900 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b  inJrnl&~1)==0 );
16910 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a        /* isMainJ
16920 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  rnl is 0 or 1 */
16930 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53 61  .  assert( (isSa
16940 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20  vepnt&~1)==0 ); 
16950 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70        /* isSavep
16960 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a  nt is 0 or 1 */.
16970 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e    assert( isMain
16980 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b  Jrnl || pDone );
16990 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c       /* pDone al
169a0 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62  ways used on sub
169b0 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61  -journals */.  a
169c0 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
169d0 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20   || pDone==0 ); 
169e0 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72    /* pDone never
169f0 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76   used on non-sav
16a00 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61  epoint */..  aDa
16a10 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  ta = pPager->pTm
16a20 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74  pSpace;.  assert
16a30 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20  ( aData );      
16a40 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
16a50 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  ge must have alr
16a60 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
16a70 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ted */.  assert(
16a80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
16a90 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d  ger)==0 || (!isM
16aa0 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76  ainJrnl && isSav
16ab0 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45  epnt) );..  /* E
16ac0 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65 20  ither the state 
16ad0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16ae0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16af0 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63  HEMOD (a transac
16b00 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61  tion .  ** or sa
16b10 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
16b20 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71   done at the req
16b30 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  uest of the call
16b40 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20  er) or this is. 
16b50 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16b60 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69  l rollback. If i
16b70 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t is a hot-journ
16b80 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  al rollback, the
16b90 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69   pager.  ** is i
16ba0 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64  n state OPEN and
16bb0 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53   holds an EXCLUS
16bc0 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f  IVE lock. Hot-jo
16bd0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20  urnal rollback. 
16be0 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66   ** only reads f
16bf0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
16c00 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75  rnal, not the su
16c10 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  b-journal..  */.
16c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16c30 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
16c40 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
16c50 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
16c60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16c70 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d  _OPEN && pPager-
16c80 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
16c90 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61  E_LOCK).  );.  a
16ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16cb0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
16cc0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20  TER_CACHEMOD || 
16cd0 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20  isMainJrnl );.. 
16ce0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
16cf0 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
16d00 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
16d10 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
16d20 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
16d30 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
16d40 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
16d50 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
16d60 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
16d70 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
16d80 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
16d90 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
16da0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
16db0 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
16dc0 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
16dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
16df0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
16e00 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  (jfd, (u8*)aData
16e10 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16e20 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34  ze, (*pOffset)+4
16e30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16e40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16e50 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b  rc;.  *pOffset +
16e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
16e70 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a  ze + 4 + isMainJ
16e80 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  rnl*4;..  /* San
16e90 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
16ea0 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
16eb0 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
16ec0 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
16ed0 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
16ee0 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
16ef0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
16f00 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
16f10 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
16f20 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
16f30 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
16f40 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
16f50 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
16f60 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
16f70 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
16f80 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
16f90 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
16fa0 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
16fb0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
16fc0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
16fd0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
16fe0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
16ff0 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20 29  rt( !isSavepnt )
17000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17010 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
17020 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70  if( pgno>(Pgno)p
17030 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c  Pager->dbSize ||
17040 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
17050 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20  st(pDone, pgno) 
17060 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17070 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17080 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b  f( isMainJrnl ){
17090 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
170a0 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66  bits(jfd, (*pOff
170b0 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b  set)-4, &cksum);
170c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
170d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
170e0 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
170f0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
17100 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d  r, (u8*)aData)!=
17110 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
17120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
17130 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
17140 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20  /* If this page 
17150 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17160 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66   played back bef
17170 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
17180 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
17190 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
171a0 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
171b0 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
171c0 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
171d0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
171e0 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
171f0 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
17200 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17210 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
17220 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
17230 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
17240 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
17250 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
17260 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
17270 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
17280 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
17290 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
172a0 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
172b0 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
172c0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
172d0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
172e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
172f0 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
17300 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
17310 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
17320 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
17330 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
17340 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
17350 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
17360 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
17370 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
17380 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
17390 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
173a0 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
173b0 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
173c0 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
173d0 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
173e0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
173f0 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
17400 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
17410 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
17420 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
17430 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
17440 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
17450 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
17460 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
17470 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
17480 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
17490 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
174a0 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
174b0 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
174c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
174d0 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
174e0 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
174f0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
17500 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
17510 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
17520 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
17530 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
17540 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
17550 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
17560 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
17570 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
17580 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
17590 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
175a0 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
175b0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
175c0 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
175d0 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
175e0 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
175f0 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
17600 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
17610 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
17620 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
17630 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
17640 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
17650 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
17660 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
17670 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
17680 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
17690 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
176a0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
176b0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
176c0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
176d0 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
176e0 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
176f0 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
17700 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17710 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
17720 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
17730 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
17740 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
17750 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
17760 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
17770 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
17780 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
17790 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
177a0 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
177b0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
177c0 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
177d0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
177e0 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
177f0 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
17800 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
17810 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
17820 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
17830 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
17840 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
17850 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17860 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
17870 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
17880 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
17890 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
178a0 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
178b0 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
178c0 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
178d0 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
178e0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
178f0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
17900 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
17910 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
17920 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
17930 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
17940 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
17950 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
17960 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
17970 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
17980 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
17990 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
179a0 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
179b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
179c0 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
179d0 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
179e0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
179f0 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
17a00 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
17a10 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
17a20 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
17a30 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
17a40 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
17a50 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
17a60 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
17a70 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
17a80 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
17a90 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
17aa0 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
17ab0 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
17ac0 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
17ad0 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
17ae0 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
17af0 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
17b00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
17b10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
17b20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
17b30 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e{.    pPg = sql
17b40 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
17b50 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
17b60 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
17b70 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
17b80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17b90 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
17ba0 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20  EN || pPg==0 || 
17bb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17bc0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
17bd0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
17be0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
17bf0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
17c00 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17c10 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
17c20 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
17c30 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
17c40 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
17c50 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
17c60 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
17c70 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
17c80 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
17c90 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
17ca0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
17cb0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
17cc0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
17cd0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
17ce0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
17cf0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
17d00 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
17d10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
17d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
17d30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
17d40 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
17d50 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
17d60 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
17d70 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17d80 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
17d90 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
17da0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
17db0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
17dc0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
17dd0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
17de0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
17df0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
17e00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
17e10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17e20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17e30 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
17e40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
17e50 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
17e60 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17e70 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
17e80 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
17e90 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17ea0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
17eb0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
17ec0 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
17ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
17ee0 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
17ef0 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
17f00 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
17f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
17f20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17f30 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
17f40 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
17f50 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
17f60 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
17f70 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17f80 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
17f90 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
17fa0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
17fb0 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
17fc0 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
17fd0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17fe0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
17ff0 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
18000 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
18010 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
18020 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
18030 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
18040 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
18050 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
18060 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
18070 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
18080 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
18090 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
180a0 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
180b0 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
180c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
180d0 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
180e0 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
180f0 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
18100 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
18110 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
18120 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
18130 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
18140 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
18150 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
18160 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
18170 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
18180 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
18190 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
181a0 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
181b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
181c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
181d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
181e0 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
181f0 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
18200 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
18210 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
18220 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18230 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
18240 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
18250 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
18260 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
18270 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
18280 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
18290 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
182a0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
182b0 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
182c0 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
182d0 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
182e0 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
182f0 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
18300 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
18310 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
18320 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
18330 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
18340 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
18350 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
18360 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18370 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
18380 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20  OLLBACK)==0 );. 
18390 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
183a0 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
183b0 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
183c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
183d0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
183e0 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  no, &pPg, 1);.  
183f0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
18400 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
18410 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
18420 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  CK)!=0 );.    pP
18430 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18440 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52   &= ~SPILLFLAG_R
18450 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28  OLLBACK;.    if(
18460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18470 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18480 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18490 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
184a0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
184b0 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
184c0 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
184d0 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
184e0 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
184f0 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
18500 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
18510 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
18520 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
18530 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
18540 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
18550 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
18560 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
18570 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
18580 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
18590 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
185a0 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
185b0 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
185c0 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
185d0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
185e0 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
185f0 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
18600 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
18610 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
18620 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
18630 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
18640 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
18650 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
18660 28 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74  (pPg);.    /* It
18670 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74   used to be that
18680 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
18690 6b 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73  keClean(pPg) was
186a0 20 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42   called here.  B
186b0 75 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  ut.    ** that c
186c0 61 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75  all was dangerou
186d0 73 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74  s and had no det
186e0 65 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20  ectable benefit 
186f0 73 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a  since the cache.
18700 20 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c      ** is normal
18710 6c 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71  ly cleaned by sq
18720 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
18730 41 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c  All() after roll
18740 62 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20  back and so.    
18750 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
18760 76 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ved. */.    page
18770 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
18780 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Pg);..    /* If 
18790 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
187a0 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
187b0 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
187c0 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
187d0 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
187e0 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
187f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
18800 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
18810 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
18820 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
18830 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
18840 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
18850 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
18860 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
18870 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
18880 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20  from disk */.   
18890 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
188a0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
188b0 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
188c0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
188d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
188e0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
188f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18900 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
18910 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
18920 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
18930 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
18940 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
18950 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
18960 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
18970 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
18980 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
18990 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
189a0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
189b0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
189c0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
189d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
189e0 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
189f0 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
18a00 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
18a10 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
18a20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
18a30 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
18a40 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
18a50 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
18a60 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
18a70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
18a80 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
18a90 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
18aa0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
18ab0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
18ac0 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
18ad0 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
18ae0 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
18af0 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
18b00 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
18b10 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
18b20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
18b30 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
18b40 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
18b50 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
18b60 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
18b70 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
18b80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
18b90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
18ba0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
18bb0 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
18bc0 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
18bd0 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
18be0 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
18bf0 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
18c00 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
18c10 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
18c20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
18c30 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
18c40 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
18c50 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
18c60 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
18c70 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
18c80 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
18c90 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
18ca0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18cb0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
18cc0 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
18cd0 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
18ce0 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
18cf0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18d00 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
18d10 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
18d20 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
18d30 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
18d40 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
18d50 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
18d60 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
18d70 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
18d80 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
18d90 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
18da0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
18db0 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
18dc0 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
18dd0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
18de0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
18df0 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
18e00 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
18e10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
18e20 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
18e30 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
18e40 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
18e50 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
18e60 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
18e70 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
18e80 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
18e90 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
18ea0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
18eb0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
18ec0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
18ed0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18ee0 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
18ef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
18f00 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
18f10 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
18f20 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
18f30 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
18f40 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
18f50 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
18f60 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
18f70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
18f80 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
18f90 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
18fa0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
18fb0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
18fc0 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
18fd0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
18fe0 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
18ff0 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
19000 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
19010 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
19020 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19030 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
19040 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
19050 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
19060 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
19070 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
19080 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
19090 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
190a0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
190b0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
190c0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
190d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
190e0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
190f0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
19100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19110 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
19120 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
19130 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
19140 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
19150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
19160 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
19170 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
19180 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
19190 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
191a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
191b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
191c0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
191d0 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
191e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
191f0 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
19200 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
19210 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
19220 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19230 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
19240 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
19250 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
19260 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
19270 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
19280 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
19290 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
192a0 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
192b0 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
192c0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
192d0 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
192e0 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
192f0 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
19300 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
19310 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
19320 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
19330 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
19340 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
19350 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
19360 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
19370 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
19380 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19390 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
193a0 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
193b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
193c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
193d0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
193e0 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
193f0 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
19400 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
19410 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
19420 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
19430 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
19440 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
19450 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
19460 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
19470 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  s = .#if SQLITE_
19480 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
19490 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 28 70 50  ECTION.      (pP
194a0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
194b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
194c0 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
194d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 28 53  .#endif.      (S
194e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
194f0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
19500 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
19510 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19520 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
19530 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
19540 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
19550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19560 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
19570 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c  ter_out;..  /* L
19580 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
19590 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
195a0 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
195b0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a  tained from.  **
195c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
195d0 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
195e0 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
195f0 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69  al.   Also obtai
19600 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e  n.  ** sufficien
19610 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73  t space (in zMas
19620 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20  terPtr) to hold 
19630 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73  the names of mas
19640 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ter.  ** journal
19650 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64   files extracted
19660 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f   from regular ro
19670 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e  llback-journals.
19680 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
19690 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
196a0 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
196b0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
196c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
196d0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
196e0 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72  ut;.  nMasterPtr
196f0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
19700 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72  ame+1;.  zMaster
19710 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
19720 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  3Malloc(nMasterJ
19730 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72  ournal + nMaster
19740 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20  Ptr + 1);.  if( 
19750 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
19760 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19770 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19780 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
19790 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61  r_out;.  }.  zMa
197a0 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74  sterPtr = &zMast
197b0 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65  erJournal[nMaste
197c0 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72  rJournal+1];.  r
197d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
197e0 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(pMaster, zMast
197f0 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29  erJournal, (int)
19800 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  nMasterJournal, 
19810 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19820 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
19830 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
19840 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e  zMasterJournal[n
19850 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d  MasterJournal] =
19860 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20   0;..  zJournal 
19870 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
19880 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75  ;.  while( (zJou
19890 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
198a0 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
198b0 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65  nal ){.    int e
198c0 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20  xists;.    rc = 
198d0 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
198e0 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20  pVfs, zJournal, 
198f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
19900 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
19910 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19920 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
19930 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19940 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
19950 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
19960 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
19970 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
19980 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
19990 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
199a0 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69  .      ** Open i
199b0 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69  t and check if i
199c0 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  t points at the 
199d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
199e0 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  If.      ** so, 
199f0 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
19a00 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
19a10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
19a20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19a30 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  int c;.      int
19a40 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51   flags = .#if SQ
19a50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
19a60 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
19a70 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
19a80 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
19a90 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
19aa0 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
19ab0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
19ac0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19ad0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19ae0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19af0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19b00 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
19b10 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
19b20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19b30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19b40 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19b50 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19b60 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19b70 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19b80 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19b90 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19ba0 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19bb0 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19bc0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19be0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19bf0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19c00 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
19c10 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
19c20 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
19c30 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
19c40 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
19c50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
19c60 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19c70 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19c80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19c90 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19ca0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19cb0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19cc0 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19cd0 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19ce0 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19cf0 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
19d00 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19d10 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
19d20 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19d30 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
19d40 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
19d50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
19d60 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19d70 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19d80 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19d90 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19da0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19db0 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19dc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19dd0 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19de0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19df0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19e00 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
19e10 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
19e20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19e30 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
19e40 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
19e50 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
19e60 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19e70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19e80 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19e90 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19ea0 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
19eb0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19ec0 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19ed0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19ee0 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19ef0 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
19f00 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
19f10 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
19f20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
19f30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
19f40 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
19f50 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
19f60 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19f70 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19f80 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19f90 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19fa0 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
19fb0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19fc0 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19fd0 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19fe0 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19ff0 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
1a000 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
1a010 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
1a020 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
1a030 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
1a040 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
1a050 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
1a060 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
1a070 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
1a080 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
1a090 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
1a0a0 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
1a0b0 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
1a0c0 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
1a0d0 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
1a0e0 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
1a0f0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
1a100 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
1a110 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
1a120 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
1a130 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
1a140 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
1a150 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
1a160 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1a170 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
1a180 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1a190 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
1a1a0 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
1a1b0 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
1a1c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
1a1d0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1a1e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a1f0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
1a200 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1a210 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
1a220 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1a230 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a240 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
1a250 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
1a260 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
1a270 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
1a280 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
1a290 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
1a2a0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1a2b0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1a2c0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1a2d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1a2e0 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
1a2f0 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
1a300 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
1a310 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
1a320 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1a330 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a340 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
1a350 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
1a360 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
1a370 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
1a380 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
1a390 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1a3a0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1a3b0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
1a3c0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
1a3d0 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
1a3e0 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
1a3f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a400 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
1a410 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
1a420 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
1a430 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
1a440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a450 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
1a460 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
1a470 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1a480 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
1a490 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
1a4a0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1a4b0 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
1a4c0 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
1a4d0 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
1a4e0 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
1a4f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1a500 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
1a510 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
1a520 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1a530 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1a540 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
1a550 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
1a560 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a570 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
1a580 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
1a590 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
1a5a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a5c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a5d0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1a5e0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
1a5f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a610 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
1a620 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
1a630 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
1a640 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
1a650 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1a660 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1a670 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
1a680 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
1a690 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
1a6a0 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
1a6b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a6c0 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
1a6d0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
1a6e0 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
1a6f0 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
1a700 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
1a710 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
1a720 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
1a730 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
1a740 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
1a750 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
1a760 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a770 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a780 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
1a790 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a7a0 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1a7b0 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a7c0 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a7d0 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a7e0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a7f0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a800 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1a810 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1a820 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1a830 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1a840 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1a850 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1a860 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1a870 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1a880 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1a890 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1a8a0 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1a8b0 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1a8c0 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1a8d0 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1a8e0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a8f0 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1a900 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1a910 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1a920 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a930 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a940 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1a950 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a960 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a970 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a980 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a990 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a9a0 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a9b0 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a9c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a9d0 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a9e0 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a9f0 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1aa00 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1aa10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1aa20 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1aa30 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1aa40 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1aa50 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1aa60 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1aa70 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1aa80 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1aa90 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1aaa0 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1aab0 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1aac0 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1aad0 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1aae0 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1aaf0 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1ab00 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1ab10 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1ab20 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1ab30 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1ab40 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1ab50 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1ab60 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1ab70 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1ab80 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1ab90 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1aba0 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1abb0 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1abc0 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1abd0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1abe0 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1abf0 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1ac00 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1ac10 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1ac20 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1ac30 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1ac40 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1ac50 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1ac60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ac70 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1ac80 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1ac90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1aca0 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1acb0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1acc0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1acd0 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1ace0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1acf0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1ad00 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1ad10 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1ad20 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1ad30 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1ad40 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1ad50 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1ad60 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1ad70 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1ad80 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1ad90 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1ada0 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1adb0 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1adc0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1add0 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1ade0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1adf0 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1ae00 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1ae10 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1ae20 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1ae30 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1ae40 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1ae50 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1ae60 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1ae70 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1ae80 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1ae90 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1aea0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1aeb0 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1aec0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1aed0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1aee0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1aef0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1af00 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1af10 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1af20 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1af30 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1af40 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1af50 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1af60 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1af70 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1af80 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1af90 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1afa0 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1afb0 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1afc0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1afd0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1afe0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1aff0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1b000 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1b010 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1b020 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1b030 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1b040 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1b050 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b060 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1b070 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1b080 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1b090 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1b0a0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b0b0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b0c0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1b0d0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1b0e0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1b0f0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1b100 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1b110 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1b120 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1b130 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1b140 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1b150 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1b160 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1b170 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1b180 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1b190 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1b1a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1b1b0 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1b1c0 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1b1d0 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1b1e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1b1f0 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1b200 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1b210 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1b220 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1b230 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b240 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1b250 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1b260 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1b270 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1b280 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1b290 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1b2a0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1b2b0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1b2c0 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1b2d0 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1b2e0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1b2f0 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1b300 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1b310 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1b320 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1b330 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1b340 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1b350 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1b360 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1b370 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1b380 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1b390 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1b3a0 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1b3b0 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1b3c0 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1b3d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1b3e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1b3f0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1b400 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1b410 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1b420 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1b430 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1b440 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1b450 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1b460 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1b470 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1b480 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1b490 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1b4a0 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1b4b0 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1b4c0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1b4d0 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1b4e0 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1b4f0 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1b500 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1b510 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1b520 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1b530 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1b540 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1b550 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1b560 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1b570 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1b580 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1b590 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1b5a0 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1b5b0 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1b5c0 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1b5d0 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1b5e0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1b5f0 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1b600 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1b610 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1b620 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1b630 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1b640 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1b650 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1b660 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1b670 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1b680 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1b690 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1b6a0 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1b6b0 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1b6c0 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1b6d0 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1b6e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b6f0 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1b700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1b710 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1b720 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b730 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1b740 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1b750 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1b760 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1b770 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1b780 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1b790 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1b7a0 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1b7b0 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b7c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b7d0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b7e0 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b7f0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1b800 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b810 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1b820 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1b830 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1b840 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1b850 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1b860 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1b870 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1b880 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1b890 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1b8a0 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1b8b0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b8c0 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1b8d0 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1b8e0 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1b8f0 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1b900 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1b910 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1b920 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1b930 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1b940 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1b950 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b960 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b970 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b980 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b990 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b9a0 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b9c0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b9d0 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b9e0 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ba00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1ba10 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1ba20 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba40 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1ba50 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1ba60 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1ba70 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1ba80 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1ba90 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1baa0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bac0 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1bad0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1bae0 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1baf0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1bb00 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1bb10 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1bb20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1bb30 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1bb40 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1bb50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1bb60 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1bb70 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1bb80 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1bb90 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1bba0 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1bbb0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1bbc0 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1bbd0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1bbe0 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1bbf0 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1bc00 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1bc10 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1bc20 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1bc30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1bc40 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1bc50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1bc60 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1bc70 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1bc80 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1bc90 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1bca0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1bcb0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1bcc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bcd0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1bce0 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1bcf0 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1bd00 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1bd10 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bd20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1bd30 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1bd40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1bd50 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1bd60 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1bd70 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1bd80 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1bd90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1bda0 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1bdb0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1bdc0 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1bdd0 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1bde0 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1bdf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1be00 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1be10 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1be20 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1be30 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1be40 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1be50 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1be60 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1be70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1be80 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1be90 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1bea0 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1beb0 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d  ,.  ** mxPathnam
1bec0 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1bed0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1bee0 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1bef0 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1bf00 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1bf10 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1bf20 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1bf30 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1bf40 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1bf50 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1bf60 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1bf70 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1bf80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bf90 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1bfa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1bfb0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1bfc0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1bfd0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1bfe0 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1bff0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1c000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1c010 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1c020 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c030 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1c040 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1c050 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c060 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1c070 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1c080 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1c090 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1c0a0 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1c0b0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1c0c0 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1c0d0 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1c0e0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1c0f0 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1c100 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1c110 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1c120 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1c130 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1c140 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1c150 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1c160 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1c170 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1c180 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1c190 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1c1a0 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1c1b0 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1c1c0 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1c1d0 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1c1e0 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1c1f0 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1c200 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1c210 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1c220 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1c230 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1c240 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1c250 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1c260 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1c270 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c280 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1c290 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c2a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c2b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1c2c0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1c2d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1c2e0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1c2f0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1c300 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1c310 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1c320 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1c330 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1c340 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1c350 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c360 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1c370 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1c380 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1c390 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1c3a0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1c3b0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1c3c0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1c3d0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1c3e0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1c3f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1c400 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1c410 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c420 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c430 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c440 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1c450 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c460 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1c470 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1c480 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1c490 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1c4a0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1c4b0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1c4c0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1c4d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1c4e0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1c4f0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1c500 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1c510 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1c520 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1c530 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1c540 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1c550 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1c560 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1c570 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1c580 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1c590 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1c5a0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1c5b0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1c5c0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1c5d0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1c5e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1c5f0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1c600 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1c610 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1c620 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1c630 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1c640 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1c650 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1c660 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1c670 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1c680 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1c690 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1c6a0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1c6b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1c6c0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1c6d0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1c6e0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1c6f0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1c700 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1c710 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1c720 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1c730 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1c740 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1c750 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1c760 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1c770 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1c780 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1c790 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1c7a0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1c7b0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1c7c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1c7d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c7e0 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1c7f0 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1c800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1c810 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1c820 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1c830 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1c840 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1c850 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1c860 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1c870 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1c880 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1c890 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1c8a0 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1c8b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1c8c0 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1c8d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1c8e0 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1c8f0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1c900 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1c910 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1c920 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1c930 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1c940 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c950 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1c960 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1c970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1c990 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c9b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1c9c0 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1c9d0 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1c9e0 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1c9f0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1ca00 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1ca10 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1ca20 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1ca30 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1ca40 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1ca50 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1ca60 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1ca70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1ca80 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1ca90 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1caa0 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1cab0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1cac0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1cad0 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1cae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1caf0 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1cb00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cb10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1cb20 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1cb30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cb40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1cb50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1cb60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cb70 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1cb80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cb90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1cba0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1cbb0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1cbc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1cbd0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1cbe0 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1cbf0 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1cc00 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1cc10 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1cc20 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1cc30 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1cc40 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1cc50 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1cc60 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1cc70 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1cc80 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1cc90 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1cca0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1ccb0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1ccc0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1ccd0 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1cce0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1ccf0 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1cd00 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1cd10 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1cd20 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1cd30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cd40 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1cd50 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1cd60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1cd70 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1cd80 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1cd90 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1cda0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1cdb0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1cdc0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1cdd0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1cde0 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1cdf0 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1ce00 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1ce10 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1ce20 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1ce30 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1ce40 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1ce50 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1ce60 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1ce70 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1ce80 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1ce90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1cea0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1ceb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1ced0 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1cee0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1cef0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1cf00 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1cf10 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1cf20 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1cf30 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1cf40 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1cf50 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1cf60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1cf70 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1cf80 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1cf90 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1cfa0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1cfb0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1cfc0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1cfd0 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1cfe0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1cff0 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1d000 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1d010 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1d020 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1d030 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1d040 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1d050 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1d060 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1d070 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1d080 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1d090 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1d0a0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1d0b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1d0c0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1d0d0 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1d0e0 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1d0f0 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1d100 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d110 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1d120 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1d130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1d140 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1d150 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1d160 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1d170 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1d180 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1d190 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1d1a0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1d1b0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1d1c0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1d1d0 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1d1e0 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1d1f0 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1d200 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1d210 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1d220 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1d230 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1d240 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1d250 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1d260 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1d270 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1d280 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1d290 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1d2a0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1d2b0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1d2c0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1d2d0 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1d2e0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1d2f0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1d300 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1d310 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d320 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1d330 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1d340 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1d350 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1d360 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1d370 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1d380 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1d390 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1d3a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1d3b0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1d3c0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1d3d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d3e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1d3f0 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1d400 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1d410 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1d420 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1d430 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
1d440 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1d460 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d470 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
1d480 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c  Master[0]!='\0',
1d490 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   0);.    testcas
1d4a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1d4b0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
1d4c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
1d4d0 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
1d4e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1d4f0 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
1d500 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
1d510 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
1d520 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
1d530 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
1d540 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
1d550 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
1d560 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
1d570 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d580 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
1d590 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1d5a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1d5b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1d5c0 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50   if( isHot && nP
1d5d0 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73  layback ){.    s
1d5e0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1d5f0 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
1d600 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f  _ROLLBACK, "reco
1d610 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1d620 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1d630 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1d640 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1d650 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1d660 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1d670 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1d680 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1d690 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1d6a0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1d6b0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1d6c0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1d6d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1d6e0 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1d6f0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1d700 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1d710 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1d720 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1d730 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1d740 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d750 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1d760 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1d770 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1d780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d790 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1d7a0 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1d7b0 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1d7c0 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1d7d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1d7e0 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1d7f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d800 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1d810 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1d820 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1d830 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1d840 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1d850 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1d860 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1d870 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1d880 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1d890 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1d8a0 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1d8b0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1d8c0 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1d8d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1d8e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1d8f0 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1d900 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1d910 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1d920 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d930 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1d940 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1d950 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1d960 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1d970 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1d980 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1d990 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1d9a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1d9b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1d9c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1d9d0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1d9e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1d9f0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1da00 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1da10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1da20 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1da30 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1da40 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1da50 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1da60 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1da70 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28  E_OMIT_WAL.  if(
1da80 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f   iFrame ){.    /
1da90 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68  * Try to pull th
1daa0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1dab0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e  write-ahead log.
1dac0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1dad0 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65  ite3WalReadFrame
1dae0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69  (pPager->pWal, i
1daf0 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67  Frame, pgsz, pPg
1db00 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  ->pData);.  }els
1db10 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1db20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28   i64 iOffset = (
1db30 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
1db40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1db50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1db60 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
1db70 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1db80 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  sz, iOffset);.  
1db90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dba0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1dbb0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
1dbc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1dbd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f  .  }..  if( pgno
1dbe0 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72  ==1 ){.    if( r
1dbf0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  c ){.      /* If
1dc00 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73   the read is uns
1dc10 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74  uccessful, set t
1dc20 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  he dbFileVers[] 
1dc30 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20  to something.   
1dc40 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20     ** that will 
1dc50 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64  never be a valid
1dc60 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20   file version.  
1dc70 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1dc80 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20  a copy.      ** 
1dc90 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20  of bytes 24..39 
1dca0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
1dcb0 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73    Bytes 28..31 s
1dcc0 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a  hould always be.
1dcd0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72        ** zero or
1dce0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1dcf0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1dd00 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20  e. Bytes 32..35 
1dd10 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20  and 35..39.     
1dd20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61   ** should be pa
1dd30 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68  ge numbers which
1dd40 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66   are never 0xfff
1dd50 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69  fffff.  So filli
1dd60 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67  ng.      ** pPag
1dd70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d  er->dbFileVers[]
1dd80 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62   with all 0xff b
1dd90 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66  ytes should suff
1dda0 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ice..      **.  
1ddb0 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e      ** For an en
1ddc0 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65  crypted database
1ddd0 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20  , the situation 
1dde0 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a  is more complex:
1ddf0 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a    bytes.      **
1de00 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1de10 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74  atabase are whit
1de20 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68  e noise.  But th
1de30 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
1de40 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20  .      ** white 
1de50 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31  noise equaling 1
1de60 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20  6 bytes of 0xff 
1de70 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73  is vanishingly s
1de80 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a  mall so.      **
1de90 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   we should still
1dea0 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f   be ok..      */
1deb0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
1dec0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ded0 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70  , 0xff, sizeof(p
1dee0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1def0 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  s));.    }else{.
1df00 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65        u8 *dbFile
1df10 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50  Vers = &((u8*)pP
1df20 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20  g->pData)[24];. 
1df30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1df40 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1df50 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
1df60 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1df70 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a  leVers));.    }.
1df80 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
1df90 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
1dfa0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
1dfb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1dfc0 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1dfd0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1dfe0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1dff0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1e000 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1e010 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1e020 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1e030 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1e040 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1e050 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1e060 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e070 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1e080 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1e090 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1e0a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1e0b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20  }../*.** Update 
1e0c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1e0d0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1e0e0 61 74 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e  at offsets 24 an
1e0f0 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68  d 92 in.** the h
1e100 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 73 71  eader and the sq
1e110 6c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d  lite version num
1e120 62 65 72 20 61 74 20 6f 66 66 73 65 74 20 39 36  ber at offset 96
1e130 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
1e140 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c  an unconditional
1e150 20 75 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c   update.  See al
1e160 73 6f 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63  so the pager_inc
1e170 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1e180 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69  ).** routine whi
1e190 63 68 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20  ch only updates 
1e1a0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1e1b0 65 72 20 69 66 20 74 68 65 20 75 70 64 61 74 65  er if the update
1e1c0 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20   is actually.** 
1e1d0 6e 65 65 64 65 64 2c 20 61 73 20 64 65 74 65 72  needed, as deter
1e1e0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 70 50 61  mined by the pPa
1e1f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1e200 44 6f 6e 65 20 73 74 61 74 65 20 76 61 72 69 61  Done state varia
1e210 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
1e220 6f 69 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f  oid pager_write_
1e230 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67  changecounter(Pg
1e240 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32  Hdr *pPg){.  u32
1e250 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1e260 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
1e270 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
1e280 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
1e290 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
1e2a0 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
1e2b0 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33  ounter = sqlite3
1e2c0 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70 50  Get4byte((u8*)pP
1e2d0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  g->pPager->dbFil
1e2e0 65 56 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33  eVers)+1;.  put3
1e2f0 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50  2bits(((char*)pP
1e300 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  g->pData)+24, ch
1e310 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
1e320 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20    /* Also store 
1e330 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73 69  the SQLite versi
1e340 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74  on number in byt
1e350 65 73 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e  es 96..99 and in
1e360 0a 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e  .  ** bytes 92..
1e370 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68 61  95 store the cha
1e380 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  nge counter for 
1e390 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69 6f  which the versio
1e3a0 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73  n number.  ** is
1e3b0 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74   valid. */.  put
1e3c0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
1e3d0 50 67 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63  Pg->pData)+92, c
1e3e0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1e3f0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e400 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e410 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49  96, SQLITE_VERSI
1e420 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23  ON_NUMBER);.}..#
1e430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e440 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_WAL./*.** Thi
1e450 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
1e460 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  voked once for e
1e470 61 63 68 20 70 61 67 65 20 74 68 61 74 20 68 61  ach page that ha
1e480 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a  s already been .
1e490 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ** written into 
1e4a0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65  the log file whe
1e4b0 6e 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74  n a WAL transact
1e4c0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1e4d0 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ck..** Parameter
1e4e0 20 69 50 67 20 69 73 20 74 68 65 20 70 61 67 65   iPg is the page
1e4f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20   number of said 
1e500 70 61 67 65 2e 20 54 68 65 20 70 43 74 78 20 61  page. The pCtx a
1e510 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61  rgument .** is a
1e520 63 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65  ctually a pointe
1e530 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1e540 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
1e550 49 66 20 70 61 67 65 20 69 50 67 20 69 73 20 70  If page iPg is p
1e560 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61  resent in the ca
1e570 63 68 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20  che, and has no 
1e580 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
1e590 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73  rences,.** it is
1e5a0 20 64 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65   discarded. Othe
1e5b0 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
1e5c0 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  are one or more 
1e5d0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72  outstanding.** r
1e5e0 65 66 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70  eferences, the p
1e5f0 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72  age content is r
1e600 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65  eloaded from the
1e610 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
1e620 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  e.** attempt to 
1e630 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66  reload content f
1e640 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1e650 20 69 73 20 72 65 71 75 69 72 65 64 20 61 6e 64   is required and
1e660 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75   fails, .** retu
1e670 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
1e680 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
1e690 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
1e6a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e6b0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76  erUndoCallback(v
1e6c0 6f 69 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20  oid *pCtx, Pgno 
1e6d0 69 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  iPg){.  int rc =
1e6e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1e6f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1e700 61 67 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50  ager *)pCtx;.  P
1e710 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
1e720 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
1e730 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  l(pPager) );.  p
1e740 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
1e750 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
1e760 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20  iPg);.  if( pPg 
1e770 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1e780 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
1e790 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a  ount(pPg)==1 ){.
1e7a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
1e7b0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
1e7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
1e7d0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20  32 iFrame = 0;. 
1e7e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e7f0 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
1e800 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d  ager->pWal, pPg-
1e810 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b  >pgno, &iFrame);
1e820 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e830 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e840 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1e850 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
1e860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e870 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e880 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1e890 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1e8a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1e8b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e8c0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
1e8d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1e8e0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1e8f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1e900 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1e910 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1e920 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1e930 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1e940 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1e950 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1e960 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1e970 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1e980 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1e990 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1e9a0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1e9b0 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1e9c0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1e9d0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1e9e0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1e9f0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1ea00 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1ea10 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1ea20 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1ea30 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1ea40 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1ea50 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1ea60 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1ea70 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1ea80 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1ea90 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1eaa0 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1eab0 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1eac0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1ead0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1eae0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1eaf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1eb00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1eb10 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1eb20 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1eb30 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1eb40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1eb50 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1eb60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1eb70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1eb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb90 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1eba0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebc0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1ebd0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1ebe0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1ebf0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1ec00 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1ec10 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1ec20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1ec30 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1ec40 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1ec50 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1ec60 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1ec70 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1ec80 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1ec90 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1eca0 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1ecb0 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1ecc0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1ecd0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1ece0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1ecf0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1ed00 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1ed10 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1ed20 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1ed30 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1ed40 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1ed50 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1ed60 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1ed70 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1ed80 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1ed90 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1eda0 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1edb0 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1edc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1edd0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1ede0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1edf0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1ee00 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1ee10 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1ee20 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1ee30 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1ee40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ee50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ee60 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1ee70 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1ee80 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1ee90 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1eea0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1eeb0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1eec0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1eed0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1eee0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1eef0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1ef00 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1ef10 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1ef20 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1ef30 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1ef40 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1ef50 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1ef60 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1ef70 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1ef80 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1ef90 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1efa0 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1efb0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1efc0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1efd0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1efe0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1eff0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1f000 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1f010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f020 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1f030 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1f040 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1f050 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1f060 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1f070 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1f080 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f090 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1f0a0 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1f0b0 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1f0c0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1f0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f0e0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1f0f0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1f100 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f120 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f130 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f160 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1f170 2f 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  /.  PgHdr *p;   
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
1f1a0 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f  ng over pages */
1f1b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1f1c0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1f1d0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1f1e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1f1f0 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1f200 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1f210 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1f220 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1f230 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1f240 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1f250 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1f260 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1f270 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1f280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f290 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1f2a0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1f2b0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1f2c0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1f2d0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1f2e0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1f2f0 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1f300 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1f310 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1f320 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1f330 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1f340 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1f350 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1f360 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1f370 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1f380 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1f390 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1f3a0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1f3b0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1f3c0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1f3d0 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74  *ppNext = &pList
1f3e0 3b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b  ;.    nList = 0;
1f3f0 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1f400 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21  ; (*ppNext = p)!
1f410 3d 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29  =0; p=p->pDirty)
1f420 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
1f430 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29  gno<=nTruncate )
1f440 7b 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74  {.        ppNext
1f450 20 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20   = &p->pDirty;. 
1f460 20 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a         nList++;.
1f470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f480 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1f490 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f4a0 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  nList = 1;.  }. 
1f4b0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
1f4c0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
1f4d0 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66   += nList;..  if
1f4e0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
1f4f0 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
1f500 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
1f510 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  st);.  rc = sqli
1f520 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61  te3WalFrames(pPa
1f530 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20  ger->pWal, .    
1f540 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1f550 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e  ze, pList, nTrun
1f560 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  cate, isCommit, 
1f570 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
1f580 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20  lags.  );.  if( 
1f590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f5a0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
1f5b0 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c   ){.    for(p=pL
1f5c0 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69  ist; p; p=p->pDi
1f5d0 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rty){.      sqli
1f5e0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1f5f0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1f600 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29   p->pgno, (u8 *)
1f610 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  p->pData);.    }
1f620 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1f630 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1f640 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1f650 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
1f660 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f670 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  );.  for(p=pList
1f680 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1f690 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74  ){.    pager_set
1f6a0 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20  _pagehash(p);.  
1f6b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
1f6c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f6d0 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
1f6e0 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1f6f0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
1f700 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
1f710 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
1f720 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
1f730 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
1f740 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
1f750 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
1f760 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
1f770 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
1f780 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
1f790 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
1f7a0 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
1f7b0 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
1f7c0 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
1f7d0 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
1f7e0 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
1f7f0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
1f800 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1f810 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
1f820 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
1f830 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1f840 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f860 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1f870 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
1f880 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f890 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1f8a0 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
1f8b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1f8c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f8d0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1f8e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1f8f0 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
1f900 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f910 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20  GER_READER );.. 
1f920 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e   /* sqlite3WalEn
1f930 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f940 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65  () was not calle
1f950 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
1f960 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  us.  ** transact
1f970 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ion in locking_m
1f980 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20  ode=EXCLUSIVE.  
1f990 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20  So call it now. 
1f9a0 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20   If we.  ** are 
1f9b0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f9c0 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65  NORMAL and EndRe
1f9d0 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75  ad() was previou
1f9e0 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a  sly called,.  **
1f9f0 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63   the duplicate c
1fa00 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e  all is harmless.
1fa10 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  .  */.  sqlite3W
1fa20 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1fa30 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
1fa40 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  l);..  rc = sqli
1fa50 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54  te3WalBeginReadT
1fa60 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1fa70 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65  r->pWal, &change
1fa80 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
1fa90 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67  LITE_OK || chang
1faa0 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  ed ){.    pager_
1fab0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1fac0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
1fad0 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74 65  pPager) ) sqlite
1fae0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
1faf0 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20  r->fd, 0, 0);.  
1fb00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1fb10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1fb20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1fb30 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1fb40 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1fb50 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1fb60 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1fb70 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1fb80 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1fb90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fba0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1fbb0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1fbc0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1fbd0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1fbe0 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1fbf0 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1fc00 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1fc10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1fc20 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1fc30 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1fc40 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1fc50 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1fc60 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1fc70 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1fc80 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1fc90 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1fca0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1fcb0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1fcc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1fcd0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fce0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1fcf0 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1fd00 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1fd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1fd30 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1fd40 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1fd50 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1fd60 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1fd70 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1fd80 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1fd90 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1fda0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1fdb0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1fdc0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1fdd0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1fde0 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1fdf0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1fe00 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1fe10 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1fe20 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1fe30 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1fe40 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1fe50 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1fe60 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1fe70 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1fe80 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1fe90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fea0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1feb0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1fec0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1fed0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1fee0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1fef0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
1ff00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ff10 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
1ff20 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65    nPage = sqlite
1ff30 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65  3WalDbsize(pPage
1ff40 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20  r->pWal);..  /* 
1ff50 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1ff60 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1ff70 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76  tabase is not av
1ff80 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
1ff90 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79  .  ** WAL sub-sy
1ffa0 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  stem, determine 
1ffb0 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20  the page counte 
1ffc0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
1ffd0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
1ffe0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
1fff0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20010 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e  s not an.  ** in
20020 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
20030 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
20040 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65   round up the re
20050 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
20060 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57   nPage==0 && ALW
20070 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65  AYS(isOpen(pPage
20080 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69  r->fd)) ){.    i
20090 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
200a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
200b0 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
200c0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
200d0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
200e0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
200f0 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
20100 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20110 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
20120 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
20130 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
20140 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
20150 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
20160 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
20170 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
20180 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
20190 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
201a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
201b0 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
201c0 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
201d0 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
201e0 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
201f0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
20200 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
20210 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
20220 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
20230 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
20240 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
20250 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
20260 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
20270 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
20280 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
20290 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
202a0 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
202b0 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
202c0 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
202d0 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
202e0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
202f0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
20300 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20310 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
20320 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
20330 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
20340 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
20350 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
20360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20370 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
20380 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20390 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
203a0 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
203b0 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
203c0 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
203d0 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
203e0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
203f0 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
20400 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
20410 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
20420 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
20430 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
20440 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
20450 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
20460 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
20470 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
20480 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
20490 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
204a0 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
204b0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
204c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
204d0 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
204e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
204f0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
20500 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
20510 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
20520 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
20530 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
20540 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
20550 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
20560 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
20570 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
20580 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
20590 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
205a0 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
205b0 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
205c0 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
205d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
205e0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
205f0 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
20600 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20610 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20620 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20630 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
20640 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
20650 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
20660 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
20670 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20680 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
20690 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206b0 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
206c0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
206d0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
206e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
206f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   Size of the dat
20700 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
20710 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
20720 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
20730 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  nPage);.    if( 
20740 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20750 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20770 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
20780 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
20790 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20  ger->zWal, 0);. 
207a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
207b0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
207c0 5f 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51  _NOENT ) rc = SQ
207d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
207e0 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65  sWal = 0;.    }e
207f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
20800 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
20810 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
20820 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
20830 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
20840 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
20850 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Wal.      );.   
20860 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
20870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20880 20 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20    if( isWal ){. 
20890 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
208a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
208b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
208c0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
208d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
208e0 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28  te3PagerOpenWal(
208f0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
20900 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
20910 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
20920 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
20930 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20  DE_WAL ){.      
20940 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20950 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
20960 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
20970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20980 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20990 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
209a0 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f   Playback savepo
209b0 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20  int pSavepoint. 
209c0 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e  Or, if pSavepoin
209d0 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c  t==NULL, then pl
209e0 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e  ayback.** the en
209f0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
20a00 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61  nal file. The ca
20a10 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
20a20 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
20a30 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54  .** a ROLLBACK T
20a40 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76  O command is inv
20a50 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f  oked on a SAVEPO
20a60 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72  INT that is a tr
20a70 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61  ansaction .** sa
20a80 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57  vepoint..**.** W
20a90 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69  hen pSavepoint i
20aa0 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e  s not NULL (mean
20ab0 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61  ing a non-transa
20ac0 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
20ad0 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c  is .** being rol
20ae0 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20  led back), then 
20af0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e  the rollback con
20b00 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74  sists of up to t
20b10 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20  hree stages,.** 
20b20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65  performed in the
20b30 20 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64   order specified
20b40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  :.**.**   * Page
20b50 73 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  s are played bac
20b60 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
20b70 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
20b80 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20   at byte.**     
20b90 6f 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65  offset PagerSave
20ba0 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20bb0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20bc0 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
20bd0 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
20be0 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  t, or to the end
20bf0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20c00 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
20c10 20 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   if PagerSavepoi
20c20 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
20c30 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   zero..**.**   *
20c40 20 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69   If PagerSavepoi
20c50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73  nt.iHdrOffset is
20c60 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
20c70 70 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64  pages are played
20c80 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61  .**     back sta
20c90 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  rting from the j
20ca0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d  ournal header im
20cb0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
20cc0 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65  ing .**     Page
20cd0 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20ce0 66 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64  ffset to the end
20cf0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20d00 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
20d10 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74     * Pages are t
20d20 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20  hen played back 
20d30 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
20d40 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74  rnal file, start
20d50 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20  ing.**     with 
20d60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
20d70 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63  nt.iSubRec and c
20d80 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
20d90 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74   end of.**     t
20da0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
20db0 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75  .**.** Throughou
20dc0 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70  t the rollback p
20dd0 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d  rocess, each tim
20de0 65 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  e a page is roll
20df0 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20  ed back, the.** 
20e00 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
20e10 74 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69  t is set in a bi
20e20 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28  tvec structure (
20e30 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69  variable pDone i
20e40 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  n the.** impleme
20e50 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20  ntation below). 
20e60 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
20e70 65 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61  ensure that a pa
20e80 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f  ge is only.** ro
20e90 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69  lled back the fi
20ea0 72 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65  rst time it is e
20eb0 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69  ncountered in ei
20ec0 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ther journal..**
20ed0 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e  .** If pSavepoin
20ee0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
20ef0 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70  pages are only p
20f00 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20f10 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
20f20 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20  nal file. There 
20f30 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61  is no need for a
20f40 20 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20   bitvec in this 
20f50 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65  case..**.** In e
20f60 69 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f  ither case, befo
20f70 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d  re playback comm
20f80 65 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e  ences the Pager.
20f90 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  dbSize variable.
20fa0 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74  ** is reset to t
20fb0 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  he value that it
20fc0 20 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61   held at the sta
20fd0 72 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f  rt of the savepo
20fe0 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e  int .** (or tran
20ff0 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67  saction). No pag
21000 65 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75  e with a page-nu
21010 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
21020 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20  n this value.** 
21030 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  is played back. 
21040 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e  If one is encoun
21050 74 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70  tered it is simp
21060 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73  ly skipped..*/.s
21070 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
21080 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74  laybackSavepoint
21090 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
210a0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
210b0 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  pSavepoint){.  i
210c0 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
210d0 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63          /* Effec
210e0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
210f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f   main journal */
21100 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
21110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
21120 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
21130 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
21140 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
21150 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21160 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
21170 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69  urn code */.  Bi
21180 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b  tvec *pDone = 0;
21190 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
211a0 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73   to ensure pages
211b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c   played back onl
211c0 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73  y once */..  ass
211d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
211e0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
211f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21200 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
21210 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
21220 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  D );..  /* Alloc
21230 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
21240 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
21250 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
21260 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
21270 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
21280 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
21290 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
212a0 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
212b0 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
212c0 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
212d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
212e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
212f0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
21300 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
21310 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
21320 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
21330 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
21340 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
21350 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
21360 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21370 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
21380 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
21390 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
213a0 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
213b0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
213c0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
213d0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
213e0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
213f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
21400 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
21410 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
21420 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
21430 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
21440 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
21450 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
21460 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
21470 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
21480 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
21490 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
214a0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
214b0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
214c0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
214d0 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
214e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
214f0 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
21500 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
21510 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
21520 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
21530 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
21540 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
21550 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
21560 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
21570 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
21580 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
21590 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
215a0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
215b0 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
215c0 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
215d0 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
215e0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
215f0 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
21600 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
21610 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
21620 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
21630 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
21640 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
21650 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
21660 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
21670 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
21680 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
21690 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
216a0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
216b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
216c0 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
216d0 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
216e0 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
216f0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
21700 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
21710 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
21720 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
21730 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21740 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
21750 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
21760 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
21770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21780 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
21790 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
217a0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
217b0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
217c0 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
217d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
217e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
217f0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21810 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21830 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21840 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
21850 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21860 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
21870 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
21880 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21890 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
218a0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
218b0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
218c0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
218d0 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
218e0 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
218f0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
21900 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
21910 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
21920 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
21930 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
21940 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
21950 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
21960 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
21970 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
21980 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
21990 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
219a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
219b0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
219c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
219d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
219e0 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
219f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21a00 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
21a10 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
21a20 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
21a30 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
21a40 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
21a50 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
21a60 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21a70 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
21a80 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
21a90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21aa0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21ab0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21ac0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
21ad0 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
21ae0 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
21af0 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
21b00 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
21b10 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
21b20 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
21b30 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
21b40 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
21b50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
21b60 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
21b70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
21b80 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
21b90 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
21ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
21bb0 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
21bc0 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
21bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21be0 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
21bf0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
21c00 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
21c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21c20 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
21c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21c40 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
21c50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21c60 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21c70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21c80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21c90 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21ca0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21cb0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21cc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
21cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
21ce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21cf0 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
21d00 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
21d10 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
21d20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
21d30 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
21d40 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
21d50 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
21d60 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21d70 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
21d80 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
21d90 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
21da0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
21db0 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
21dc0 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
21dd0 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
21de0 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
21df0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
21e00 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
21e10 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29  4 offset = (i64)
21e20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62  pSavepoint->iSub
21e30 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
21e40 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69  ageSize);..    i
21e50 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
21e60 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
21e70 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53  rc = sqlite3WalS
21e80 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61  avepointUndo(pPa
21e90 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65  ger->pWal, pSave
21ea0 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29  point->aWalData)
21eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21ec0 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69  ii=pSavepoint->i
21ed0 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49  SubRec; rc==SQLI
21ee0 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67  TE_OK && ii<pPag
21ef0 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b  er->nSubRec; ii+
21f00 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
21f10 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69  ( offset==(i64)i
21f20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
21f30 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
21f40 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21f50 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21f60 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44  ger, &offset, pD
21f70 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  one, 0, 1);.    
21f80 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
21f90 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
21fa0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42  .  }..  sqlite3B
21fb0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f  itvecDestroy(pDo
21fc0 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ne);.  if( rc==S
21fd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21ff0 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20  ff = szJ;.  }.. 
22000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22010 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
22020 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
22030 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
22040 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
22050 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
22060 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63  empting to recyc
22070 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75  le clean and unu
22080 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f  sed pages..*/.vo
22090 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
220a0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
220b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
220c0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
220d0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
220e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
220f0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
22100 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22110 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
22120 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
22130 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
22140 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
22150 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69  ttempting to spi
22160 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72  ll pages to jour
22170 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
22180 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c  te3PagerSetSpill
22190 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
221a0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
221b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
221c0 33 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73  3PcacheSetSpills
221d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
221e0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
221f0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51  ./*.** Invoke SQ
22200 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22210 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68  SIZE based on th
22220 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
22230 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of szMmap..*/.st
22240 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
22250 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
22260 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53   *pPager){.#if S
22270 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
22280 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f  IZE>0.  sqlite3_
22290 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
222a0 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f  r->fd;.  if( isO
222b0 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70  pen(fd) && fd->p
222c0 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
222d0 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69  n>=3 ){.    sqli
222e0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20  te3_int64 sz;.  
222f0 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73    sz = pPager->s
22300 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65  zMmap;.    pPage
22310 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28  r->bUseFetch = (
22320 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65  sz>0);.    setGe
22330 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65  tterMethod(pPage
22340 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  r);.    sqlite3O
22350 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
22360 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
22370 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
22380 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23  IZE, &sz);.  }.#
22390 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
223a0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
223b0 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65  m size of any me
223c0 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64  mory mapping mad
223d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
223e0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
223f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
22400 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  mapLimit(Pager *
22410 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f  pPager, sqlite3_
22420 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
22430 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
22440 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65  = szMmap;.  page
22450 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61  rFixMaplimit(pPa
22460 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ger);.}../*.** F
22470 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ree as much memo
22480 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
22490 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  rom the pager..*
224a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
224b0 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20  gerShrink(Pager 
224c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
224d0 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28  te3PcacheShrink(
224e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
224f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
22500 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68  t settings of th
22510 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65  e pager to those
22520 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
22530 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65  e pgFlags parame
22540 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  ter..**.** The "
22550 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67  level" in pgFlag
22560 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52  s & PAGER_SYNCHR
22570 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20  ONOUS_MASK sets 
22580 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a  the robustness.*
22590 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
225a0 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
225b0 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72  to OS crashes or
225c0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
225d0 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74  by.** changing t
225e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
225f0 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
22600 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e  ng the journals.
22610 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f  .** There are fo
22620 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ur levels:.**.**
22630 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
22640 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
22650 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
22660 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
22670 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
22680 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
22690 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
226a0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
226b0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
226c0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
226d0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
226e0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
226f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22700 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
22710 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
22720 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
22730 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
22740 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
22750 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
22760 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
22770 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
22780 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
22790 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
227a0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
227b0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
227c0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
227d0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
227e0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
227f0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
22800 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
22810 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
22820 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
22830 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
22840 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22850 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
22860 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22870 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22880 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22890 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
228a0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
228b0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
228c0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
228d0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
228e0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
228f0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
22900 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
22920 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
22930 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
22940 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
22950 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
22960 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
22970 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
22980 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
22990 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
229a0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
229b0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
229c0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
229d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
229e0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
229f0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
22a00 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
22a10 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ollback..**.**  
22a20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73    EXTRA     This
22a30 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78   is like FULL ex
22a40 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73  cept that is als
22a50 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65  o syncs the dire
22a60 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  ctory.**        
22a70 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61        that conta
22a80 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ins the rollback
22a90 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74   journal after t
22aa0 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20  he rollback.**  
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72              jour
22ac0 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e  nal is unlinked.
22ad0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
22ae0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
22af0 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
22b00 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
22b10 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
22b20 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
22b30 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
22b40 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
22b50 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
22b60 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
22b70 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
22b80 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
22b90 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
22ba0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
22bb0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
22bc0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
22bd0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
22be0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
22bf0 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
22c00 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
22c10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
22c20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
22c30 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
22c40 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
22c50 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
22c60 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
22c70 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
22c80 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
22c90 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
22ca0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
22cb0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
22cc0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
22cd0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
22ce0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
22cf0 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22d00 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22d10 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54   FULL.** and EXT
22d20 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e  RA for WAL mode.
22d30 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
22d40 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
22d50 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
22d60 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
22d70 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
22d80 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
22d90 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
22da0 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
22db0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
22dc0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
22dd0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
22de0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
22df0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
22e00 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
22e10 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
22e20 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
22e30 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22e40 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
22e50 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
22e60 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
22e70 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
22e80 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
22e90 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
22ea0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
22eb0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
22ec0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
22ed0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
22ee0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
22ef0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
22f00 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
22f10 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
22f20 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22f30 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
22f40 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
22f50 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
22f60 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
22f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
22f80 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
22f90 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
22fa0 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  gs(.  Pager *pPa
22fb0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
22fc0 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20  he pager to set 
22fd0 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72  safety level for
22fe0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
22ff0 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56  gFlags      /* V
23000 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
23010 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65  ){.  unsigned le
23020 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20  vel = pgFlags & 
23030 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23040 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50  S_MASK;.  if( pP
23050 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
23060 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
23070 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
23080 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
23090 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
230a0 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20  extraSync = 0;. 
230b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
230c0 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
230d0 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
230e0 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b  RONOUS_OFF ?1:0;
230f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
23100 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50  lSync = level>=P
23110 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
23120 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20  _FULL ?1:0;.    
23130 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
23140 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52  c = level==PAGER
23150 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54  _SYNCHRONOUS_EXT
23160 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69  RA ?1:0;.  }.  i
23170 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
23180 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
23190 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
231a0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
231b0 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
231c0 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
231d0 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
231e0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
231f0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23200 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23210 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
23220 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
23230 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
23240 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
23250 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
23260 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
23270 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23280 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23290 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
232a0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
232b0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
232c0 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
232d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
232e0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
232f0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
23300 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
23310 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
23320 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
23330 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
23340 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
23350 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
23360 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
23370 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23380 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23390 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
233a0 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
233b0 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
233c0 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
233d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
233e0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
233f0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
23400 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
23410 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
23420 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23430 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
23440 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
23450 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
23460 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
23470 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
23480 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
23490 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
234a0 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
234b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
234c0 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
234d0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
234e0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
234f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
23500 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
23510 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
23520 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
23530 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23540 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
23550 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
23560 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
23570 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23580 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
23590 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
235a0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
235b0 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
235c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
235d0 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
235e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
235f0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
23600 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
23610 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
23620 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
23630 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
23640 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
23650 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
23660 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
23670 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
23680 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23690 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
236a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
236b0 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
236c0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
236d0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
236e0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
236f0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
23700 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
23710 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23730 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
23740 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
23750 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
23760 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
23770 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
23780 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
23790 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
237a0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
237b0 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
237c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
237d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
237e0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
237f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
23800 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
23810 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
23820 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
23830 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23840 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23850 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53 51 4c  ags |=  .#if SQL
23860 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
23870 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
23880 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
23890 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
238a0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
238b0 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
238c0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  f.            SQ
238d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
238e0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
238f0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
23900 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
23910 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53  EN_EXCLUSIVE | S
23920 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
23930 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d  EONCLOSE;.  rc =
23940 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
23950 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20  Pager->pVfs, 0, 
23960 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c  pFile, vfsFlags,
23970 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72   0);.  assert( r
23980 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
23990 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b  isOpen(pFile) );
239a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
239b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
239c0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
239d0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
239e0 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68  pager invokes th
239f0 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
23a00 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  f sqlite3OsLock(
23a10 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  ) returns .** SQ
23a20 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74  LITE_BUSY when t
23a30 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
23a40 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f   from no-lock to
23a50 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a   a SHARED lock,.
23a60 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e  ** or when tryin
23a70 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
23a80 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  m a RESERVED loc
23a90 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  k to an EXCLUSIV
23aa0 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64  E .** lock. It d
23ab0 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65  oes *not* invoke
23ac0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
23ad0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
23ae0 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20   from.** SHARED 
23af0 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20  to RESERVED, or 
23b00 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66  when upgrading f
23b10 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58  rom SHARED to EX
23b20 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63  CLUSIVE.** (whic
23b30 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
23b40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
23b50 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a  back). Summary:.
23b60 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69  **.**   Transiti
23b70 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
23b80 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f            | Invo
23b90 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72  kes xBusyHandler
23ba0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
23bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
23be0 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20  *   NO_LOCK     
23bf0 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b    -> SHARED_LOCK
23c00 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20        | Yes.**  
23c10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
23c20 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  > RESERVED_LOCK 
23c30 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41     | No.**   SHA
23c40 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58  RED_LOCK   -> EX
23c50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
23c60 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45   No.**   RESERVE
23c70 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53  D_LOCK -> EXCLUS
23c80 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73  IVE_LOCK   | Yes
23c90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75  .**.** If the bu
23ca0 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
23cb0 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ack returns non-
23cc0 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
23cd0 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49  s .** retried. I
23ce0 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72  f it returns zer
23cf0 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49  o, then the SQLI
23d00 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73  TE_BUSY error is
23d10 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20  .** returned to 
23d20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68  the caller of th
23d30 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  e pager API func
23d40 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
23d50 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
23d60 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
23d70 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
23da0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
23db0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
23dc0 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ),         /* Po
23dd0 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61  inter to busy-ha
23de0 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a  ndler function *
23df0 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
23e00 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20  andlerArg       
23e10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
23e20 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20  ment to pass to 
23e30 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
23e40 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75  ){.  pPager->xBu
23e50 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73  syHandler = xBus
23e60 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67  yHandler;.  pPag
23e70 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
23e80 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  Arg = pBusyHandl
23e90 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73  erArg;..  if( is
23ea0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
23eb0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61   ){.    void **a
23ec0 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
23ed0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
23ee0 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  er;.    assert( 
23ef0 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29  ((int(*)(void *)
23f00 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79  )(ap[0]))==xBusy
23f10 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61  Handler );.    a
23f20 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42  ssert( ap[1]==pB
23f30 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b  usyHandlerArg );
23f40 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
23f50 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
23f60 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
23f70 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c  _FCNTL_BUSYHANDL
23f80 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b  ER, (void *)ap);
23f90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
23fa0 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
23fb0 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
23fc0 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
23fd0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
23fe0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
23ff0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
24000 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
24010 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
24020 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
24030 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
24040 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
24050 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
24060 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
24070 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
24080 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
24090 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
240a0 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  ERR, an SQLITE_I
240b0 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64  OERR_xxx sub-cod
240c0 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e or SQLITE_FULL
240d0 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
240e0 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  se, if all of th
240f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
24100 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  true:.**.**   * 
24110 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  the new page siz
24120 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61  e (value of *pPa
24130 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64  geSize) is valid
24140 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20   (a power .**   
24150 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e    of two between
24160 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f   512 and SQLITE_
24170 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69  MAX_PAGE_SIZE, i
24180 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a  nclusive), and.*
24190 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61  *.**   * there a
241a0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
241b0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
241c0 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  s, and.**.**   *
241d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
241e0 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69   either not an i
241f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
24200 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20  e or it is.**   
24210 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    an in-memory d
24220 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72  atabase that cur
24230 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20  rently consists 
24240 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a  of zero pages..*
24250 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61  *.** then the pa
24260 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20  ger object page 
24270 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a  size is set to *
24280 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24290 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
242a0 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68  e is changed, th
242b0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
242c0 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67   uses sqlite3Pag
242d0 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74  erMalloc() .** t
242e0 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50  o obtain a new P
242f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
24300 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61  uffer. If this a
24310 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24320 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c  t .** fails, SQL
24330 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
24340 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
24350 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20  ge size remains 
24360 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49  unchanged. .** I
24370 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65  n all other case
24380 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  s, SQLITE_OK is 
24390 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
243a0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
243b0 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c   is not changed,
243c0 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
243d0 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65  one of the enume
243e0 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69  rated.** conditi
243f0 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74  ons above is not
24400 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72   true, the pager
24410 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74   was in error st
24420 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a  ate when this.**
24430 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
24440 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65  lled, or because
24450 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
24460 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66  cation attempt f
24470 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20  ailed, .** then 
24480 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65  *pPageSize is se
24490 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65  t to the old, re
244a0 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  tained page size
244b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
244c0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
244d0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
244e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
244f0 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c   u32 *pPageSize,
24500 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a   int nReserve){.
24510 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24520 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69  E_OK;..  /* It i
24530 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
24540 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65  o do a full asse
24550 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
24560 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20   here, as this. 
24570 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79   ** function may
24580 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   be called from 
24590 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e  within PagerOpen
245a0 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73  (), before the s
245b0 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tate.  ** of the
245c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   Pager object is
245d0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73   internally cons
245e0 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  istent..  **.  *
245f0 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74  * At one point t
24600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24610 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
24620 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24630 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45  in .  ** PAGER_E
24640 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20  RROR state. But 
24650 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f  since PAGER_ERRO
24660 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65  R state guarante
24670 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  es that.  ** the
24680 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f  re is at least o
24690 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ne outstanding p
246a0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74  age reference, t
246b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
246c0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  * is a no-op for
246d0 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f   that case anyho
246e0 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70  w..  */..  u32 p
246f0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
24700 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
24710 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
24720 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
24730 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
24740 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
24750 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
24760 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
24770 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
24780 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50  ).   && sqlite3P
24790 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
247a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
247b0 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a  0 .   && pageSiz
247c0 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28  e && pageSize!=(
247d0 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
247e0 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63  Size .  ){.    c
247f0 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c  har *pNew = NULL
24800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24810 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20   New temp space 
24820 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65  */.    i64 nByte
24830 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70   = 0;..    if( p
24840 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
24850 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70  GER_OPEN && isOp
24860 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
24870 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24880 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
24890 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74  Pager->fd, &nByt
248a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
248b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
248c0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
248d0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
248e0 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
248f0 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
24900 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49  pNew ) rc = SQLI
24910 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
24920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
24930 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24940 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
24950 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
24960 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
24970 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
24980 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
24990 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
249a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
249b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
249c0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
249d0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
249e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
249f0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
24a00 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  w;.      pPager-
24a10 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
24a20 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65  ((nByte+pageSize
24a30 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20  -1)/pageSize);. 
24a40 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
24a50 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
24a60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24a70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
24a80 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a  ee(pNew);.    }.
24a90 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a    }..  *pPageSiz
24aa0 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
24ab0 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Size;.  if( rc==
24ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24ad0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20   if( nReserve<0 
24ae0 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61  ) nReserve = pPa
24af0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20  ger->nReserve;. 
24b00 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65     assert( nRese
24b10 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
24b20 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70  ve<1000 );.    p
24b30 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
24b40 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b  = (i16)nReserve;
24b50 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74  .    pagerReport
24b60 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
24b70 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
24b80 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  it(pPager);.  }.
24b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
24bb0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
24bc0 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
24bd0 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
24be0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
24bf0 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
24c00 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
24c10 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
24c20 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
24c30 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
24c40 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
24c50 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
24c60 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
24c70 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
24c80 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
24c90 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
24ca0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
24cb0 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
24cc0 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
24cd0 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
24ce0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
24cf0 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
24d00 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
24d10 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
24d20 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
24d30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
24d40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
24d50 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
24d60 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
24d70 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
24d80 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
24d90 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
24da0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
24db0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
24dc0 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
24dd0 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
24de0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
24df0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
24e00 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
24e10 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
24e20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
24e30 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
24e40 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
24e50 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
24e60 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
24e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24e80 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
24e90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24ea0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
24eb0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
24ec0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
24ed0 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
24ee0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24ef0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
24f00 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20  OPEN );      /* 
24f10 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f  Called only by O
24f20 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20  P_MaxPgcnt */.  
24f30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24f40 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e  mxPgno>=pPager->
24f50 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50  dbSize );  /* OP
24f60 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63  _MaxPgcnt enforc
24f70 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74  es this */.  ret
24f80 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
24f90 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
24fa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
24fb0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
24fc0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
24fd0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
24fe0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
24ff0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
25000 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
25010 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
25020 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
25030 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
25040 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
25050 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
25060 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
25070 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
25080 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
25090 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
250a0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
250b0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
250c0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
250d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
250e0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
250f0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
25100 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
25110 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
25120 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
25130 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
25140 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
25150 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
25160 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25170 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
25180 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25190 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
251a0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
251b0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
251c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
251d0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
251e0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
251f0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
25200 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
25210 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
25220 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25230 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
25240 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
25250 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
25260 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
25270 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
25280 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
25290 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
252a0 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
252b0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
252c0 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
252d0 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
252e0 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
252f0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
25300 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
25310 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
25320 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
25330 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
25340 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25350 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
25360 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
25370 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
25380 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
25390 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
253a0 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
253b0 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
253c0 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
253d0 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
253e0 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
253f0 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
25400 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
25410 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
25420 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
25430 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
25440 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
25450 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
25460 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
25470 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
25480 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25490 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
254a0 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
254b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
254c0 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
254d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
254e0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
254f0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
25500 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
25510 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
25520 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
25530 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
25540 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
25550 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
25560 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
25570 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
25580 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74  y btree immediat
25590 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69  ely after creati
255a0 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65  ng.  ** the Page
255b0 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65  r object.  There
255c0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e   has not been an
255d0 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
255e0 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20  transition.  ** 
255f0 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e  to WAL mode yet.
25600 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
25610 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
25620 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69  ger) );..  if( i
25630 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25640 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
25650 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
25660 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
25670 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25680 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
25690 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
256a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
256b0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
256c0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
256d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
256e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
256f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
25700 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
25710 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
25720 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  when a read-tran
25730 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
25740 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e  on.** the pager.
25750 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20   It returns the 
25760 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
25770 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
25780 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77  abase..**.** How
25790 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c  ever, if the fil
257a0 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61  e is between 1 a
257b0 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62  nd <page-size> b
257c0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
257d0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63  en .** this is c
257e0 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61  onsidered a 1 pa
257f0 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  ge file..*/.void
25800 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25810 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
25820 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
25830 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
25840 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
25850 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
25860 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
25870 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
25880 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b  ITER_FINISHED );
25890 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e  .  *pnPage = (in
258a0 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  t)pPager->dbSize
258b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
258c0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
258d0 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
258e0 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
258f0 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
25900 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
25910 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
25920 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
25930 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
25940 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
25950 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
25960 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
25970 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
25980 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
25990 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
259a0 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
259b0 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
259c0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
259d0 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
259e0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
259f0 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
25a00 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
25a10 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
25a20 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
25a30 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
25a40 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
25a50 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
25a60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
25a70 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
25a80 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
25a90 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
25aa0 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
25ab0 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
25ac0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
25ad0 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
25ae0 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
25af0 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
25b00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
25b10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25b20 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
25b30 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
25b40 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
25b50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25b80 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43   code */..  /* C
25b90 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69  heck that this i
25ba0 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70  s either a no-op
25bb0 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65   (because the re
25bc0 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20  quested lock is 
25bd0 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65  .  ** already he
25be0 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  ld), or one of t
25bf0 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  he transitions t
25c00 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e  hat the busy-han
25c10 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dler.  ** may be
25c20 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c   invoked during,
25c30 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
25c40 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a  e comment above.
25c50 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
25c60 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
25c70 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
25c80 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
25c90 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20  >=locktype).    
25ca0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
25cb0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26  Lock==NO_LOCK &&
25cc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
25cd0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c  D_LOCK).       |
25ce0 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  | (pPager->eLock
25cf0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
25d00 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  && locktype==EXC
25d10 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
25d20 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  ;..  do {.    rc
25d30 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
25d40 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
25d50 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
25d60 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
25d70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
25d80 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
25d90 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a  yHandlerArg) );.
25da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25db0 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61  /*.** Function a
25dc0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25dd0 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20  straint(pPager) 
25de0 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20  checks that one 
25df0 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  of the .** follo
25e00 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72  wing is true for
25e10 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
25e20 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
25e30 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a  e page-cache:.**
25e40 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67  .**   a) The pag
25e50 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
25e60 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
25e70 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
25e80 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65  e .**      curre
25e90 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  nt database imag
25ea0 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a  e, in pages, OR.
25eb0 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68  **.**   b) if th
25ec0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77  e page content w
25ed0 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74  ere written at t
25ee0 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75  his time, it wou
25ef0 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62  ld not.**      b
25f00 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  e necessary to w
25f10 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
25f20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20   content out to 
25f30 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
25f40 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65  **      (as dete
25f50 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69  rmined by functi
25f60 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  on subjRequiresP
25f70 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  age())..**.** If
25f80 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61   the condition a
25f90 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20  sserted by this 
25fa0 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f  function were no
25fb0 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a  t true, and the.
25fc0 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65  ** dirty page we
25fd0 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64  re to be discard
25fe0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
25ff0 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53  e via the pagerS
26000 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69  tress().** routi
26010 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28  ne, pagerStress(
26020 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74  ) would not writ
26030 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
26040 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a  ge content to.**
26050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26060 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69  le. If a savepoi
26070 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
26080 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ere rolled back 
26090 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61  after.** this ha
260a0 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72  ppened, the corr
260b0 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75  ect behavior wou
260c0 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65  ld be to restore
260d0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
260e0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
260f0 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69  age. However, si
26100 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74  nce this content
26110 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20   is not present 
26120 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65  in either.** the
26130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26140 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66  r the portion of
26150 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
26160 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75  urnal and .** su
26170 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64  b-journal rolled
26180 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e   back the conten
26190 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72  t could not be r
261a0 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a  estored and the.
261b0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
261c0 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e would become c
261d0 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68  orrupt. It is th
261e0 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74  erefore fortunat
261f0 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20  e that .** this 
26200 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e  circumstance can
26210 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69  not arise..*/.#i
26220 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
26230 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76  _DEBUG).static v
26240 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
26250 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50  teConstraintCb(P
26260 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73  gHdr *pPg){.  as
26270 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
26280 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
26290 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52    assert( !subjR
262a0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
262b0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70   || pPg->pgno<=p
262c0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  Pg->pPager->dbSi
262d0 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ze );.}.static v
262e0 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61  oid assertTrunca
262f0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67  teConstraint(Pag
26300 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
26310 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
26320 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
26330 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74  >pPCache, assert
26340 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26350 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ntCb);.}.#else.#
26360 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72   define assertTr
26370 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26380 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a  (pPager).#endif.
26390 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
263a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
263b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
263c0 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
263d0 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
263e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
263f0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
26400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
26410 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
26420 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
26430 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
26440 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
26450 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
26460 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
26470 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
26480 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
26490 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
264a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
264b0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
264c0 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
264d0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
264e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
264f0 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69  Once this functi
26500 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  on has been call
26510 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74  ed, the transact
26520 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20  ion must either 
26530 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  be.** rolled bac
26540 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20  k or committed. 
26550 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
26560 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63  o call this func
26570 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e  tion and.** then
26580 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e   continue writin
26590 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
265a0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
265b0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
265c0 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
265d0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
265e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
265f0 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65  r->dbSize>=nPage
26600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26610 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
26620 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
26630 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  MOD );.  pPager-
26640 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
26650 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f  ..  /* At one po
26660 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  int the code her
26670 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54  e called assertT
26680 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26690 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75  t() to.  ** ensu
266a0 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  re that all page
266b0 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65  s being truncate
266c0 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f  d away by this o
266d0 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20  peration are,.  
266e0 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** if one or mor
266f0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
26700 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69   open, present i
26710 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  n the savepoint 
26720 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f  .  ** journal so
26730 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62   that they can b
26740 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68  e restored if th
26750 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72  e savepoint is r
26760 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e  olled.  ** back.
26770 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   This is no long
26780 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  er necessary as 
26790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
267a0 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63   now only.  ** c
267b0 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f  alled right befo
267c0 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  re committing a 
267d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20  transaction. So 
267e0 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20  although the .  
267f0 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  ** Pager object 
26800 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f  may still have o
26810 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28  pen savepoints (
26820 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
26830 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79  !=0), .  ** they
26840 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
26850 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61  d back. So the a
26860 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
26870 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20  straint() call. 
26880 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   ** is no longer
26890 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a   correct. */.}..
268a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
268b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
268c0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
268d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
268e0 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73  ollback. It.** s
268f0 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  yncs the journal
26900 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74   file to disk, t
26910 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d  hen sets pPager-
26920 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74  >journalHdr to t
26930 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  he.** size of th
26940 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
26950 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  o that the pager
26960 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
26970 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61  ine knows.** tha
26980 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  t the entire jou
26990 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
269a0 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  en synced..**.**
269b0 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a   Syncing a hot-j
269c0 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62  ournal to disk b
269d0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
269e0 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
269f0 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61   ensures .** tha
26a00 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69  t if a power-fai
26a10 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69  lure occurs duri
26a20 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c  ng the rollback,
26a30 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
26a40 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f  t.** attempts ro
26a50 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
26a60 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79   system recovery
26a70 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a   sees the same j
26a80 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e  ournal.** conten
26a90 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73  t as this proces
26aa0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  s..**.** If ever
26ab0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70  ything goes as p
26ac0 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f  lanned, SQLITE_O
26ad0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
26ae0 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e  therwise, .** an
26af0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
26b00 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
26b10 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  t pagerSyncHotJo
26b20 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
26b30 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
26b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
26b50 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
26b60 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  c ){.    rc = sq
26b70 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
26b80 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
26b90 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20  SYNC_NORMAL);.  
26ba0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
26bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
26bc0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
26bd0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
26be0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
26bf0 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lHdr);.  }.  ret
26c00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26c10 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
26c20 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20  nce to a memory 
26c30 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65  mapped page obje
26c40 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ct for page numb
26c50 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65  er pgno. .** The
26c60 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c   new object will
26c70 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72   use the pointer
26c80 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64   pData, obtained
26c90 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a   from xFetch()..
26ca0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
26cb0 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f  , set *ppPage to
26cc0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
26cd0 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  w page reference
26ce0 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53  .** and return S
26cf0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
26d00 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  ise, return an S
26d10 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
26d20 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50   and set.** *ppP
26d30 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a  age to zero..**.
26d40 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63  ** Page referenc
26d50 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63  es obtained by c
26d60 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
26d70 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72  tion should be r
26d80 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61  eleased.** by ca
26d90 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61  lling pagerRelea
26da0 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  seMapPage()..*/.
26db0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
26dc0 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a  AcquireMapPage(.
26dd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
26e00 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  t */.  Pgno pgno
26e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
26e30 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20  umber */.  void 
26e40 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
26e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
26e60 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66 6f  etch()'d data fo
26e70 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
26e80 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20   PgHdr **ppPage 
26e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ea0 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65   /* OUT: Acquire
26eb0 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f  d page object */
26ec0 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  .){.  PgHdr *p; 
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ee0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
26ef0 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20 72  mapped page to r
26f00 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66  eturn */.  .  if
26f10 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  ( pPager->pMmapF
26f20 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a  reelist ){.    *
26f30 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61  ppPage = p = pPa
26f40 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26f50 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
26f60 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20  pMmapFreelist = 
26f70 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70  p->pDirty;.    p
26f80 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
26f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26fa0 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20  ->nExtra>=8 );. 
26fb0 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
26fc0 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65  tra, 0, 8);.  }e
26fd0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26fe0 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26ff0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
27000 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
27010 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
27020 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
27030 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27040 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
27050 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
27060 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
27070 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
27080 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27090 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
270a0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
270b0 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
270c0 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
270d0 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
270e0 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
270f0 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
27100 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
27110 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
27120 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
27130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
27140 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
27150 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
27160 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
27170 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
27180 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
27190 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
271a0 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
271b0 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
271c0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
271d0 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
271e0 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
271f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
27200 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
27210 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
27220 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
27230 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
27240 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
27250 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
27260 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
27270 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
27280 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
27290 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
272a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
272b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
272c0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
272d0 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
272e0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
272f0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
27300 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27310 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
27320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
27330 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
27340 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
27350 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
27360 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
27370 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
27380 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
27390 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
273a0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
273b0 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
273c0 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
273d0 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
273e0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
273f0 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
27400 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
27410 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
27420 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
27430 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27440 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
27450 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
27460 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
27470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
27480 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
27490 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
274a0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
274b0 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
274c0 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
274d0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
274e0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
274f0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
27500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
27510 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
27520 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27530 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
27540 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27550 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27560 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27570 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27580 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
27590 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
275a0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
275b0 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
275c0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
275d0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
275e0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
275f0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
27600 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
27610 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
27620 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
27630 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
27640 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27650 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27660 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27670 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27680 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
27690 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
276a0 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
276b0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
276c0 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
276d0 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
276e0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
276f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
27700 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
27710 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20   sqlite3 *db){. 
27720 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
27730 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
27740 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
27750 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  db || pagerUseWa
27760 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
27770 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
27780 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27790 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
277a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
277b0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
277c0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
277d0 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
277e0 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
277f0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
27800 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
27810 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
27820 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
27830 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27840 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 64  _WAL.  assert( d
27850 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61  b || pPager->pWa
27860 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
27870 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
27880 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67  ->pWal, db, pPag
27890 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
278a0 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
278b0 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62 20 26  ize,.      (db &
278c0 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
278d0 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c  QLITE_NoCkptOnCl
278e0 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d 70 29  ose) ? 0 : pTmp)
278f0 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  .  );.  pPager->
27900 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66  pWal = 0;.#endif
27910 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
27920 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
27930 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
27940 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
27950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
27960 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20   If it is open, 
27970 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
27980 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c   file before cal
27990 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  ling UnlockAndRo
279a0 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49  llback..    ** I
279b0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f  f this is not do
279c0 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79  ne, then an unsy
279d0 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
279e0 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
279f0 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61   .    ** file ma
27a00 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  y be played back
27a10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
27a20 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66  se. If a power f
27a30 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20  ailure occurs . 
27a40 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73     ** while this
27a50 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74   is happening, t
27a60 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
27a70 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  d become corrupt
27a80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27a90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27aa0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
27ab0 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  to sync the jour
27ac0 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70  nal, shift the p
27ad0 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  ager.    ** into
27ae0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
27af0 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e  . This causes Un
27b00 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20  lockAndRollback 
27b10 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20  to unlock the.  
27b20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e    ** database an
27b30 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  d close the jour
27b40 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74  nal file without
27b50 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
27b60 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61  oll it.    ** ba
27b70 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69  ck or finalize i
27b80 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61  t. The next data
27b90 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68  base user will h
27ba0 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f  ave to do hot-jo
27bb0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c  urnal.    ** rol
27bc0 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63  lback before acc
27bd0 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
27be0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
27bf0 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
27c00 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
27c10 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
27c20 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53  r(pPager, pagerS
27c30 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  yncHotJournal(pP
27c40 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
27c50 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
27c60 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
27c70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
27c80 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
27c90 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
27ca0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27cb0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
27cc0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
27cd0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
27ce0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
27cf0 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
27d00 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  )).  sqlite3OsCl
27d10 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
27d20 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ;.  sqlite3OsClo
27d30 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
27d40 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
27d50 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74  e(pTmp);.  sqlit
27d60 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
27d70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
27d80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
27d90 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
27da0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
27db0 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
27dc0 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
27dd0 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
27de0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27df0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
27e00 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
27e10 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
27e20 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
27e30 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
27e40 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
27e50 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
27e60 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
27e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27e80 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
27e90 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
27ea0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
27eb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27ec0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
27ed0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
27ee0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
27ef0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
27f00 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
27f10 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
27f20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
27f30 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
27f40 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
27f50 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
27f60 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
27f70 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27f80 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
27f90 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
27fa0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
27fb0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
27fc0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
27fd0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
27fe0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
27ff0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
28000 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
28010 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
28020 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
28030 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
28040 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
28050 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
28060 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
28070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
28080 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
28090 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
280a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
280b0 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
280c0 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
280d0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
280e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
280f0 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
28100 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
28110 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
28120 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
28130 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
28140 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
28150 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
28160 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28170 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
28180 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
28190 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
281a0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
281b0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
281c0 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
281d0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
281e0 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
281f0 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
28200 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
28210 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
28220 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
28230 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
28240 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
28250 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
28260 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
28270 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
28280 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
28290 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
282a0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
282b0 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
282c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
282d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
282e0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
282f0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
28300 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
28310 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
28320 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
28330 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
28340 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
28350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28360 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
28370 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
28380 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
28390 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
283a0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
283b0 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
283c0 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
283d0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
283e0 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
283f0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
28400 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
28410 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
28420 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
28430 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
28440 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
28450 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
28460 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
28470 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
28480 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
28490 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
284a0 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
284b0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
284c0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
284d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
284e0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
284f0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
28500 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
28510 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
28520 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
28530 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
28540 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
28550 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
28560 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
28570 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
285a0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
285b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
285c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
285d0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
285e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
285f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
28600 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
28610 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28620 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28630 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
28640 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
28650 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
28660 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
28670 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
28680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28690 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
286a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
286b0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
286c0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
286d0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
286e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
286f0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
28700 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28710 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28720 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
28730 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
28740 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
28750 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
28760 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
28770 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
28780 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
28790 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
287a0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
287b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
287c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
287d0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
287e0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
287f0 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
28800 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
28810 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
28820 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
28830 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
28840 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
28850 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
28860 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
28870 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
28880 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
28890 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
288a0 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
288b0 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
288c0 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
288d0 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
288e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
288f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
28900 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
28910 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
28920 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
28930 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
28940 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
28950 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
28960 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
28970 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
28980 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
28990 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
289a0 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
289b0 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
289c0 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
289d0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
289e0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
289f0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
28a00 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
28a10 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
28a20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
28a30 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
28a40 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
28a50 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
28a60 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
28a70 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
28a80 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
28a90 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
28aa0 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
28ab0 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
28ac0 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
28ad0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
28ae0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
28af0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
28b00 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
28b10 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
28b20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
28b30 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
28b40 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
28b50 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
28b60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
28b70 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
28b80 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
28b90 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
28ba0 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
28bb0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
28bc0 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
28bd0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
28be0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
28bf0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
28c00 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
28c10 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
28c20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28c30 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
28c40 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
28c50 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
28c60 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
28c70 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
28c80 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
28c90 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
28ca0 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
28cb0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
28cc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
28cd0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
28ce0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
28cf0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
28d00 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
28d10 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
28d20 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
28d30 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
28d40 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
28d50 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
28d60 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
28d70 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28d80 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
28d90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
28da0 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
28db0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
28dc0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
28dd0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
28de0 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
28df0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
28e00 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
28e10 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
28e20 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
28e30 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
28e40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
28e50 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
28e60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
28e70 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
28e80 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28e90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28ea0 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
28eb0 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
28ec0 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
28ed0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
28ee0 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
28ef0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
28f00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28f10 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
28f20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
28f30 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
28f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28f50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28f60 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
28f70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
28f80 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
28f90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28fa0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28fb0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
28fc0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
28fd0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
28fe0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
28ff0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
29000 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
29010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
29020 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
29030 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
29040 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
29050 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
29060 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
29070 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
29080 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
29090 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
290a0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
290b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
290c0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
290d0 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
290e0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
290f0 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
29100 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
29110 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
29120 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
29130 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
29140 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
29150 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
29160 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
29170 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
29180 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
29190 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
291a0 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
291b0 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
291c0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
291d0 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
291e0 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
291f0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
29200 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29210 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
29220 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
29230 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29240 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
29250 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
29260 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
29270 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
29280 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29290 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
292a0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
292b0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
292c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
292d0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
292e0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
292f0 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
29300 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29310 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29330 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
29340 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
29350 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
29360 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
29370 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29380 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
29390 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
293a0 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
293b0 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
293c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
293d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
293e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
293f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29410 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29420 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
29430 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
29440 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
29450 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
29460 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29470 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
29480 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
29490 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
294a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
294b0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
294c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
294d0 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
294e0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
294f0 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
29500 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
29510 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
29520 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
29530 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29540 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29550 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
29560 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
29570 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
29580 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
29590 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
295a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
295b0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
295c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
295d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
295e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
295f0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
29600 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
29610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29620 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29630 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
29640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
29650 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
29660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
29670 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
29680 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
29690 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
296a0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
296b0 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
296c0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
296d0 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
296e0 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
296f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
29700 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
29710 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
29720 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
29730 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
29740 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
29750 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
29760 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29770 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
29780 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
29790 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
297a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
297b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
297c0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
297d0 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
297e0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
297f0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
29800 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
29810 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
29820 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
29830 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
29840 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
29850 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
29860 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29870 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
29880 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
29890 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
298a0 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
298b0 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
298c0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
298d0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
298e0 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
298f0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
29900 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
29910 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
29920 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
29930 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
29940 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
29950 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
29960 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
29970 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
29980 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
29990 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
299a0 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
299b0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
299c0 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
299d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
299e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
299f0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
29a00 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
29a10 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
29a20 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
29a30 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
29a40 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
29a50 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
29a60 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
29a70 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
29a80 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
29a90 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
29aa0 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
29ab0 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
29ac0 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
29ad0 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
29ae0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
29af0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
29b00 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
29b10 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
29b20 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
29b30 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
29b40 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
29b50 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
29b60 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
29b70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
29b80 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
29b90 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
29ba0 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
29bb0 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
29bc0 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
29bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
29be0 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
29bf0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
29c00 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
29c10 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
29c20 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
29c30 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
29c40 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
29c50 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
29c60 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
29c70 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
29c80 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
29c90 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
29ca0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
29cb0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29cc0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
29cd0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29ce0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
29cf0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
29d00 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
29d10 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
29d20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29d30 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
29d40 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
29d50 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
29d60 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
29d70 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
29d80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29d90 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29da0 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
29db0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
29dc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
29dd0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29df0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29e00 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
29e10 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
29e20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
29e30 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
29e40 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
29e50 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
29e60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
29e70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29e80 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50  ->tempFile || pP
29e90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29ea0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29ec0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
29ed0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
29ee0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
29ef0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
29f00 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
29f10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29f20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29f30 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29f40 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29f50 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29f60 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29f70 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29f80 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29f90 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29fa0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29fb0 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29fc0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29fd0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29fe0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29ff0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2a000 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
2a010 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
2a020 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
2a030 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
2a040 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
2a050 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
2a060 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
2a070 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
2a080 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
2a090 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
2a0a0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
2a0b0 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
2a0c0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
2a0d0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
2a0e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2a0f0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
2a100 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
2a110 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a120 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
2a130 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
2a140 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
2a150 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
2a160 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
2a170 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
2a180 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
2a190 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
2a1a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2a1b0 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
2a1c0 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
2a1d0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
2a1e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
2a1f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2a200 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
2a210 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
2a220 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
2a230 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2a240 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
2a250 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2a260 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
2a270 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
2a280 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
2a290 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
2a2a0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
2a2b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
2a2c0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2a2d0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
2a2e0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
2a2f0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
2a300 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
2a310 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
2a320 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
2a330 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
2a340 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
2a350 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
2a360 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
2a370 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
2a380 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
2a390 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2a3a0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
2a3b0 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
2a3c0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
2a3d0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
2a3e0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
2a3f0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
2a400 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2a410 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
2a420 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
2a430 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
2a440 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2a450 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
2a460 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
2a470 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
2a480 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
2a490 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
2a4a0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
2a4b0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4e0 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
2a4f0 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
2a500 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
2a510 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2a520 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2a530 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2a540 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2a550 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2a560 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2a570 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2a580 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2a590 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a5a0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2a5b0 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2a5c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a5d0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
2a5e0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
2a5f0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
2a600 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a610 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a620 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2a630 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a640 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2a650 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2a660 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2a670 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2a680 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2a690 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2a6a0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2a6b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a6c0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2a6d0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2a6e0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2a6f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a700 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2a710 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2a720 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2a730 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2a740 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2a750 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2a760 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2a770 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2a780 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a790 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a7a0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2a7b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a7c0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2a7d0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2a7e0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2a7f0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2a800 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2a810 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2a820 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2a830 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a840 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2a850 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2a860 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2a870 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2a880 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2a890 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2a8a0 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2a8b0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2a8c0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2a8d0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2a8e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2a8f0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2a900 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2a910 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2a920 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a930 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2a940 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2a950 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2a960 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2a970 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2a980 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2a990 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a9a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a9b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2a9c0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2a9d0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2a9e0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2a9f0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2aa00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2aa10 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2aa20 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2aa30 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2aa40 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2aa50 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2aa60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2aa70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2aa80 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2aa90 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2aaa0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2aab0 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2aac0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2aad0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2aae0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2aaf0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2ab00 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2ab10 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2ab20 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2ab30 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2ab40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ab50 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2ab60 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2ab70 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2ab80 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   =  SQLITE_OPEN_
2ab90 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c  SUBJOURNAL | SQL
2aba0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2abb0 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  TE .      | SQLI
2abc0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2abd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2abe0 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20  LUSIVE .      | 
2abf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2ac00 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69  TEONCLOSE;.    i
2ac10 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20  nt nStmtSpill = 
2ac20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2ac30 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66  tmtSpill;.    if
2ac40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2ac50 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2ac60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2ac70 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2ac80 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2ac90 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31   nStmtSpill = -1
2aca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2acb0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2acc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
2acd0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  , 0, pPager->sjf
2ace0 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53  d, flags, nStmtS
2acf0 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pill);.  }.  ret
2ad00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ad10 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2ad20 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2ad30 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2ad40 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2ad50 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal. .**.** If 
2ad60 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2ad70 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2ad80 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2ad90 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2ada0 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2adb0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2adc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2add0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ade0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2adf0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2ae00 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2ae10 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2ae20 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2ae30 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2ae40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ae50 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2ae60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2ae70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2ae80 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2ae90 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2aea0 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2aeb0 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2aec0 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2aed0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2aee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2aef0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2af00 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2af10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2af20 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2af30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2af40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2af50 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2af60 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2af70 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2af80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2af90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2afa0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2afb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2afc0 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2afd0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2afe0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2aff0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2b000 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2b010 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2b020 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2b030 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2b040 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2b050 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2b060 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2b070 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2b080 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2b090 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2b0a0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2b0b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2b0c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2b0d0 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2b0e0 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2b0f0 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2b100 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2b110 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2b120 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2b130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2b150 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2b160 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2b170 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2b180 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2b190 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2b1a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2b1b0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
2b1c0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2b1d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2b1e0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2b1f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b200 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2b210 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b220 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2b230 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2b240 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2b250 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2b260 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2b270 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2b280 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2b290 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b2a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b2b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b2c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2b2d0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2b2e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2b2f0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2b300 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2b310 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b320 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2b330 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2b340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2b350 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2b360 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2b370 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2b380 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2b390 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b3a0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2b3b0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b3c0 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2b3d0 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2b3e0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b3f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b400 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b410 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2b420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b430 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2b440 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b450 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2b460 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2b470 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2b480 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2b490 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2b4a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2b4b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2b4c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2b4d0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2b4e0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2b4f0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2b500 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2b510 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2b520 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2b530 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2b540 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2b550 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2b560 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2b570 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2b580 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2b590 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2b5a0 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2b5b0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2b5c0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2b5d0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2b5e0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b5f0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2b600 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2b610 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2b620 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b630 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b650 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b660 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b670 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b680 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b690 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b6a0 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b6b0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b6c0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b6d0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b6e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b6f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b700 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b710 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b720 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b730 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b740 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b750 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b760 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2b770 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2b780 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2b790 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2b7a0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b7b0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2b7c0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b7d0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2b7e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b7f0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2b800 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2b810 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b820 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2b830 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b840 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b850 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2b860 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2b870 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2b880 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2b890 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2b8a0 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2b8b0 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2b8c0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2b8d0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2b8e0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2b8f0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2b900 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2b910 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2b920 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2b930 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b940 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b950 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b960 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b970 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b980 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b990 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b9a0 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b9b0 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b9c0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b9d0 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b9e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b9f0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2ba00 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2ba10 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2ba20 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2ba30 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2ba40 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2ba50 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2ba60 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2ba70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2ba80 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2ba90 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2baa0 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2bab0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2bac0 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2bad0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2bae0 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2baf0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2bb00 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2bb10 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2bb20 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2bb30 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2bb40 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2bb50 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2bb60 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2bb70 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2bb80 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2bb90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2bba0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2bbb0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2bbc0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2bbd0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2bbe0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2bbf0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2bc00 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2bc10 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2bc20 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2bc30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bc40 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2bc50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2bc60 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2bc70 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2bc80 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bc90 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2bca0 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2bcb0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2bcc0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2bcd0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2bce0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2bcf0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2bd00 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2bd10 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2bd20 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2bd30 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2bd40 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2bd50 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2bd60 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2bd70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bd80 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2bd90 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2bda0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bdb0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2bdc0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2bdd0 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2bde0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2bdf0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2be00 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2be10 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2be20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2be30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2be40 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2be50 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2be60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2be70 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2be80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2be90 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2bea0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2beb0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2bec0 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2bed0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2bee0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2bef0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2bf00 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2bf10 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2bf20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2bf30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2bf40 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2bf50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2bf60 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2bf70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bf80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2bf90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2bfa0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2bfb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2bfc0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2bfd0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2bfe0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2bff0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2c000 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2c010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c020 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2c030 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2c040 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2c050 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2c060 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2c070 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2c080 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2c090 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2c0a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2c0b0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2c0c0 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2c0d0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2c0e0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2c0f0 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2c100 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2c110 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2c120 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2c130 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2c140 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2c150 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2c160 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2c170 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2c180 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2c190 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2c1a0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2c1b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2c1c0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2c1d0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2c1e0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2c1f0 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2c200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c210 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2c220 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2c230 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2c240 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2c250 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2c260 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c270 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2c280 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2c290 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2c2a0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2c2b0 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2c2c0 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2c2d0 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2c2e0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2c2f0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2c300 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2c310 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2c320 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2c330 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2c340 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c350 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2c360 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2c370 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2c380 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2c390 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2c3a0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2c3b0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2c3c0 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2c3d0 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2c3e0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2c3f0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2c400 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2c410 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2c420 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2c430 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2c440 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2c450 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2c460 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2c470 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2c480 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2c490 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2c4a0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2c4b0 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2c4c0 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2c4d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2c4e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2c4f0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2c500 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2c510 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2c520 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2c530 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2c540 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2c550 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2c560 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2c570 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2c580 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2c590 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2c5a0 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2c5b0 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2c5c0 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2c5d0 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2c5e0 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2c5f0 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2c600 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2c610 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2c620 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2c630 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2c640 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2c650 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2c660 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2c670 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2c680 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2c690 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2c6a0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2c6b0 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2c6c0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2c6d0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2c6e0 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2c6f0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c700 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2c710 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2c720 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2c730 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2c740 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2c750 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2c760 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2c770 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2c780 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2c790 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2c7a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c7b0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2c7c0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2c7d0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2c7e0 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2c7f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2c800 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2c810 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2c820 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2c830 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2c840 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2c850 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2c860 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2c870 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2c880 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2c890 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2c8a0 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2c8b0 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2c8c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2c8d0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2c8e0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c8f0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2c900 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2c910 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2c920 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2c930 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2c940 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c950 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2c960 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c970 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2c980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c990 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2c9a0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2c9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2c9c0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2c9d0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c9e0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2c9f0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ca00 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2ca10 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2ca20 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2ca30 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2ca40 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2ca50 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2ca60 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2ca70 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2ca80 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2ca90 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2caa0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2cab0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2cac0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2cad0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2cae0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2caf0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2cb00 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2cb10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2cb20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2cb30 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2cb40 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2cb50 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2cb60 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2cb70 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2cb80 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2cb90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2cba0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2cbb0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2cbc0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2cbd0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2cbe0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2cbf0 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2cc00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2cc10 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2cc20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2cc30 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2cc40 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2cc50 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2cc60 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2cc70 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2cc80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2cc90 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2cca0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2ccb0 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2ccc0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2ccd0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2cce0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2ccf0 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2cd00 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2cd10 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2cd20 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2cd30 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2cd40 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2cd50 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2cd60 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2cd70 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2cd80 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2cd90 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2cda0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2cdb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2cdc0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2cdd0 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2cde0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2cdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ce00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2ce10 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2ce20 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2ce30 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2ce40 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2ce50 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2ce60 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2ce70 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2ce80 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2ce90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2cea0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ceb0 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c  ).  */.  journal
2cec0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2ced0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2cee0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20  Size(pVfs));..  
2cef0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2cf00 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2cf10 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2cf20 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2cf30 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2cf40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2cf50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2cf60 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2cf70 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2cf80 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2cf90 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2cfa0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2cfb0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2cfc0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2cfd0 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2cfe0 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2cff0 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2d000 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2d010 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  PT;.      nPathn
2d020 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2d030 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2d040 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2d050 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2d060 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2d070 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2d080 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2d090 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2d0a0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2d0b0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2d0c0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2d0d0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2d0e0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2d0f0 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2d100 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2d110 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2d120 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2d130 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2d140 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2d150 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d160 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2d170 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2d180 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2d190 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d1a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2d1b0 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2d1c0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2d1d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2d1e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d1f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d200 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2d210 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2d220 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2d230 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2d240 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2d250 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2d260 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2d270 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2d280 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2d290 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2d2a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d2b0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2d2c0 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2d2d0 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2d2e0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2d2f0 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2d300 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2d310 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2d320 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2d330 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d340 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2d350 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2d360 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2d370 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2d380 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2d390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d3a0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2d3b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2d3c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2d3d0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2d3e0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2d3f0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2d400 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2d410 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2d420 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2d430 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2d440 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2d450 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2d460 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2d470 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2d480 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2d490 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2d4a0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2d4b0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2d4c0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2d4d0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2d4e0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2d4f0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2d500 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d510 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2d520 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2d530 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d550 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d560 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d570 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d580 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2d590 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2d5a0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2d5b0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2d5c0 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2d5d0 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2d5e0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2d5f0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2d600 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2d610 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2d620 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2d630 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2d640 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2d650 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2d680 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d690 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d6b0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2d6c0 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2d6d0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d6e0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d6f0 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2d700 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2d710 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2d720 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d730 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d740 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d750 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2d760 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d770 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d780 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d790 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d7a0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2d7b0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d7c0 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2d7d0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2d7e0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2d7f0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2d800 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2d810 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2d820 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2d830 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2d840 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2d850 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2d860 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2d870 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d880 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2d890 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2d8a0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2d8b0 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2d8c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d8d0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d8e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d8f0 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d900 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d910 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d920 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d930 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d940 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d950 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d960 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d970 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d990 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d9a0 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d9c0 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d9e0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d9f0 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2da00 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2da10 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2da20 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2da30 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2da40 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2da50 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2da60 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
2da70 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2da80 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2da90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2daa0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2dab0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2dac0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2dad0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2dae0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2daf0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2db00 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2db10 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2db20 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2db30 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2db40 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2db50 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2db60 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2db70 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2db80 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2db90 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2dba0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2dbb0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2dbc0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2dbd0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2dbe0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2dbf0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2dc00 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2dc10 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2dc20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2dc30 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2dc40 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2dc50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2dc60 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2dc70 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2dc80 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2dc90 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2dca0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2dcb0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2dcc0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2dcd0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2dce0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2dcf0 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2dd00 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2dd10 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2dd20 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2dd30 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dd40 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2dd50 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dd60 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2dd70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2dd80 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2dd90 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2dda0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2ddb0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2ddc0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2ddd0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2dde0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ddf0 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2de00 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2de10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2de20 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2de30 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2de40 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2de50 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2de60 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2de70 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2de80 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2de90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2dea0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2deb0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2dec0 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2ded0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2dee0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2def0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2df00 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2df10 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2df20 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2df30 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2df40 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2df50 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2df60 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2df70 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2df80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2df90 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2dfa0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2dfb0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2dfc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2dfd0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2dfe0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2dff0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2e000 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2e010 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2e020 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2e030 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2e040 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2e050 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2e060 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2e070 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2e080 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2e090 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2e0a0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2e0b0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2e0c0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2e0d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2e0e0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2e0f0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2e100 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2e110 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2e120 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2e130 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2e140 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2e150 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2e160 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2e170 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e180 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2e190 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2e1a0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2e1b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2e1c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e1d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2e1e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2e1f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2e200 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2e210 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2e220 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2e230 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e240 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2e250 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2e260 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2e270 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e280 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2e290 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2e2a0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2e2b0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2e2c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e2d0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2e2e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e2f0 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2e300 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e310 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2e320 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e340 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2e350 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2e360 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2e370 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2e380 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2e390 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e3a0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e3b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e3c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2e3d0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e3e0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2e3f0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2e400 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e410 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e420 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2e430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e440 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2e450 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e460 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2e470 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2e480 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2e490 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e4a0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2e4b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e4c0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2e4d0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2e4e0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2e4f0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e500 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2e510 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e520 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2e530 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2e540 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e550 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e560 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e570 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2e580 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2e590 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2e5a0 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2e5b0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e5c0 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e5d0 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e5e0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e5f0 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e600 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e610 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e620 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e630 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e640 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e650 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e660 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e670 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e680 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e690 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e6a0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e6b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e6c0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e6d0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e6e0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e6f0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e700 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e710 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e720 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e730 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e740 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e750 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e760 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e770 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e780 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e790 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2e7a0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2e7b0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2e7c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2e7d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2e7e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2e7f0 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2e800 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2e810 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2e820 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2e830 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2e840 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2e850 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e860 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e870 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2e880 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2e890 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2e8a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2e8b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2e8c0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e8d0 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2e8e0 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2e8f0 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2e900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e910 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2e920 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2e930 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2e940 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e950 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2e960 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2e970 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2e980 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2e990 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2e9a0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2e9b0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2e9c0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2e9d0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2e9e0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2e9f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ea00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ea10 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2ea20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ea30 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2ea40 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2ea50 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2ea60 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2ea70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2ea80 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2ea90 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2eaa0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2eab0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eac0 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2ead0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61 73 73  nExtra);.    ass
2eae0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38 20 26  ert( nExtra>=8 &
2eaf0 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  & nExtra<1000 );
2eb00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2eb10 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2eb20 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2eb30 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2eb50 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2eb60 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2eb70 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2eb80 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2eb90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2eba0 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2ebb0 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2ebc0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2ebd0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2ebe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ebf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2ec00 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2ec10 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2ec20 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2ec30 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2ec40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ec50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2ec60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2ec70 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2ec80 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2ec90 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2eca0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2ecb0 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2ecc0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2ecd0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2ece0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2ecf0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2ed00 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2ed10 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2ed20 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2ed30 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ed40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2ed50 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ed60 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2ed70 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2ed80 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2ed90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2eda0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2edb0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2edc0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2edd0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2ede0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2edf0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ee00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2ee10 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2ee20 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2ee30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2ee40 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2ee50 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2ee60 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2ee70 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2ee80 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2ee90 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2eea0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2eeb0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2eec0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2eed0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2eee0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2eef0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2ef00 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2ef10 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2ef20 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2ef30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2ef40 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2ef50 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2ef60 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2ef70 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2ef80 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2ef90 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2efa0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2efb0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2efc0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2efd0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2efe0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
2eff0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
2f000 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2f010 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2f020 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43   0 : SQLITE_SYNC
2f030 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67 65  _NORMAL;.  pPage
2f040 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2f050 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
2f060 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
2f070 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2f080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f090 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2f0a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f0b0 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d  ger->extraSync==
2f0c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f0d0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2f0e0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2f0f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2f100 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2f110 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f120 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2f130 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2f140 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2f150 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2f160 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2f170 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2f180 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2f190 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2f1a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2f1b0 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2f1c0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2f1d0 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2f1e0 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2f1f0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2f200 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2f210 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2f220 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2f230 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f240 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2f250 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2f260 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2f270 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2f280 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2f290 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2f2a0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2f2b0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2f2c0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2f2d0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2f2e0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2f2f0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2f300 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2f310 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2f320 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2f330 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f340 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f350 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2f360 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2f370 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2f380 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2f390 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2f3a0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2f3b0 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2f3c0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2f3d0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2f3e0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2f3f0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2f400 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2f410 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d  it;.  setGetterM
2f420 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
2f430 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2f440 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2f450 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2f460 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2f470 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2f480 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2f490 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2f4a0 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2f4b0 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2f4c0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2f4d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f4e0 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
2f4f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f500 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
2f510 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
2f520 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
2f530 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
2f540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2f550 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2f560 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
2f570 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
2f580 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
2f590 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
2f5a0 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2f5b0 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
2f5c0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
2f5d0 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
2f5e0 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
2f5f0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
2f600 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
2f610 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
2f620 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
2f630 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
2f640 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2f650 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
2f660 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2f670 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2f680 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
2f690 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
2f6a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f6b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f6c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
2f6d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f6e0 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
2f6f0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2f700 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
2f710 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
2f720 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
2f730 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2f740 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
2f750 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
2f760 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
2f770 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
2f780 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
2f790 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
2f7a0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
2f7b0 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
2f7c0 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
2f7d0 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
2f7e0 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
2f7f0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
2f800 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
2f810 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
2f820 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2f830 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2f840 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
2f850 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
2f860 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2f870 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
2f880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2f890 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2f8a0 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2f8b0 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2f8c0 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2f8d0 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2f8e0 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2f8f0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2f900 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2f910 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2f920 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2f930 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2f940 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2f950 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2f960 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2f970 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2f980 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f990 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2f9a0 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2f9b0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2f9c0 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2f9d0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2f9e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2f9f0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2fa00 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2fa10 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
2fa20 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
2fa30 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2fa40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2fa50 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
2fa60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
2fa70 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
2fa80 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
2fa90 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
2faa0 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
2fab0 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
2fac0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2fad0 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
2fae0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
2faf0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
2fb00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fb10 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
2fb20 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
2fb30 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
2fb40 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
2fb50 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
2fb60 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
2fb70 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2fb80 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
2fb90 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2fba0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
2fbb0 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
2fbc0 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
2fbd0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
2fbe0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
2fbf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
2fc00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fc10 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
2fc20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
2fc30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2fc40 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
2fc50 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
2fc60 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
2fc70 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
2fc80 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
2fc90 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
2fca0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
2fcb0 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2fcc0 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
2fcd0 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
2fce0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
2fcf0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2fd00 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
2fd10 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
2fd20 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
2fd30 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
2fd40 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
2fd50 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
2fd60 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
2fd70 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
2fd80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2fd90 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
2fda0 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
2fdb0 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
2fdc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
2fdd0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
2fde0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
2fdf0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
2fe00 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
2fe10 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2fe20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2fe30 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2fe40 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
2fe50 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
2fe60 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
2fe70 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2fe80 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
2fe90 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
2fea0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
2feb0 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
2fec0 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
2fed0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
2fee0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
2fef0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2ff00 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
2ff10 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
2ff20 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
2ff30 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
2ff40 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2ff50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ff60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
2ff70 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
2ff80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ff90 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
2ffa0 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
2ffb0 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
2ffc0 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
2ffd0 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
2ffe0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2fff0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
30000 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
30010 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
30020 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30030 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30040 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
30050 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
30060 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
30070 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
30080 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
30090 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
300a0 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
300b0 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
300c0 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
300d0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
300e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
300f0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
30100 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
30110 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30120 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
30130 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30140 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
30150 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
30160 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30170 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
30180 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
30190 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
301a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
301b0 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
301c0 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
301d0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
301e0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
301f0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
30200 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
30210 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
30220 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
30230 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
30240 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
30250 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
30260 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
30270 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
30280 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
30290 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
302a0 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
302b0 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
302c0 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
302d0 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
302e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
302f0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
30300 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
30310 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
30320 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
30330 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
30340 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
30350 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
30360 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
30370 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
30380 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
30390 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
303a0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
303b0 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
303c0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
303d0 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
303e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
303f0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
30400 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
30410 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
30420 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30430 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
30440 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
30450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30460 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
30470 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30480 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
30490 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
304a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
304b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
304c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
304d0 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
304e0 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
304f0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
30500 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
30510 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
30520 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
30530 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
30540 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
30550 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
30560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30570 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
30580 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
30590 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
305a0 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
305b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
305c0 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
305d0 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
305e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
305f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
30600 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
30610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
30620 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
30630 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
30640 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
30650 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
30660 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
30670 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
30680 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
30690 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
306a0 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
306b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
306c0 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
306d0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
306e0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
306f0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
30700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30710 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
30720 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
30730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30740 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30750 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
30760 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30770 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
30780 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
30790 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
307a0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
307b0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
307c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
307d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
307e0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
307f0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
30800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30810 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
30820 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
30830 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
30840 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
30850 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
30860 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30880 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
30890 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
308a0 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
308b0 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
308c0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
308d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
308e0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
308f0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
30900 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
30910 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
30920 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
30930 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
30940 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
30950 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30960 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30970 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30980 20 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69       int f = .#i
30990 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
309a0 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
309c0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
309d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
309e0 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
309f0 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
30a00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
30a10 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30a20 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30a30 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30a50 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
30a60 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30a70 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
30a80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30a90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30aa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30ab0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
30ac0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
30ad0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
30ae0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
30af0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
30b00 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30b10 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30b20 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
30b30 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
30b40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30b50 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30b60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30b70 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30b80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30b90 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30ba0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
30bb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30bc0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
30bd0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
30be0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
30bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
30c00 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30c10 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30c20 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
30c30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
30c40 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
30c50 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
30c60 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
30c70 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
30c80 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30c90 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30ca0 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
30cb0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30cc0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30cd0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30ce0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30cf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30d00 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30d10 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30d20 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30d30 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
30d40 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
30d50 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
30d60 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
30d70 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
30d80 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30d90 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30da0 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
30db0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30dc0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30dd0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30de0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30df0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30e00 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30e20 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30e30 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30e40 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30e50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30e60 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30e70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30e80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30ea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30eb0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
30ec0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30ed0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30ee0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30ef0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30f00 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30f10 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30f20 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30f30 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
30f40 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30f50 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30f60 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30f70 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30f80 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30f90 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30fa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30fb0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30fc0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30fd0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30fe0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
30ff0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
31000 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
31010 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
31020 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
31030 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
31040 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
31050 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
31060 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
31070 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
31080 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
31090 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
310a0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
310b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
310c0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
310d0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
310e0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
310f0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
31100 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
31110 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
31120 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
31130 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
31140 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
31150 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
31160 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
31170 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
31180 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
31190 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
311a0 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
311b0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
311c0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
311d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
311e0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
311f0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
31200 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
31210 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
31220 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
31230 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
31240 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
31250 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
31260 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
31270 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
31280 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
31290 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
312a0 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
312b0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
312c0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
312d0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
312e0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
312f0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
31300 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
31310 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
31320 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
31330 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
31340 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
31350 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
31360 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
31370 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
31380 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31390 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
313a0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
313b0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
313c0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
313d0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
313e0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
313f0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
31400 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
31410 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
31420 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
31430 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
31440 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
31450 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
31460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
31470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31480 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31490 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
314a0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
314b0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
314c0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
314d0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
314e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
314f0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
31500 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
31510 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
31520 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
31530 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
31540 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
31550 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
31560 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
31570 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
31580 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
31590 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
315a0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
315b0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
315c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
315d0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
315e0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
315f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
31600 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
31610 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
31620 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
31630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31640 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
31650 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
31660 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31670 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31680 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31690 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
316a0 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
316b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
316c0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
316d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
316e0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
316f0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
31700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31710 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
31720 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31730 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
31740 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
31750 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
31760 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31770 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
31780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31790 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
317a0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
317b0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
317c0 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
317d0 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
317e0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
317f0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
31800 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31810 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
31820 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
31830 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31840 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
31850 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
31860 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
31870 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
31880 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
31890 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
318a0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
318b0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
318c0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
318d0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
318e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
318f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31900 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31910 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
31920 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
31930 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
31940 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
31950 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
31960 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
31970 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31980 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31990 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
319a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
319b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
319c0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
319d0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
319e0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
319f0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
31a00 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31a10 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
31a20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
31a30 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
31a40 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
31a50 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
31a60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31a70 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
31a80 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
31a90 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
31aa0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
31ab0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
31ac0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
31ad0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
31ae0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
31af0 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
31b00 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31b10 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31b20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
31b30 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
31b40 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31b50 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
31b60 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
31b70 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
31b80 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31b90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31ba0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
31bb0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
31bc0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
31bd0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
31be0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
31bf0 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
31c00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31c10 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
31c20 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
31c30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
31c40 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31c50 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
31c60 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
31c70 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
31c80 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31c90 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31ca0 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31cb0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31cc0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31cd0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31ce0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31d00 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31d10 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
31d20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
31d30 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
31d40 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
31d50 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
31d60 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31d70 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
31d80 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31d90 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31da0 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31db0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31dc0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31dd0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31de0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31df0 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31e00 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31e10 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31e20 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31e30 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31e40 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
31e50 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
31e60 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
31e70 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
31e80 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
31e90 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
31ea0 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31eb0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31ec0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
31ed0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31ee0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31ef0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31f00 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31f10 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
31f20 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
31f30 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
31f40 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
31f50 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
31f60 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
31f70 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
31f80 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
31f90 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
31fa0 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31fb0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31fc0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
31fd0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31fe0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31ff0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
32000 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
32010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32020 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
32030 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32040 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
32050 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
32060 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
32070 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
32080 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
32090 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
320a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
320b0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
320c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
320d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
320e0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
320f0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
32100 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32110 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
32120 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
32130 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
32140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
32150 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
32160 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
32170 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
32180 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54  t f = .#if SQLIT
32190 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
321a0 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
321b0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
321c0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
321d0 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
321e0 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
321f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
32200 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32210 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
32220 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
32230 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
32240 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32250 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32260 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32270 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32280 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32290 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
322a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
322b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
322c0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
322d0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
322e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
322f0 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
32300 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
32310 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
32320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
32330 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
32340 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32350 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
32360 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
32370 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32380 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
32390 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
323a0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
323b0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
323c0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
323d0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
323e0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
323f0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
32400 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
32410 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
32420 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
32430 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
32440 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
32450 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
32460 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
32470 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
32480 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32490 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
324a0 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
324b0 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
324c0 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
324d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
324e0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
324f0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
32500 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
32510 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
32520 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
32530 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32540 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
32550 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32560 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32570 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
32580 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32590 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
325a0 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
325b0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
325c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
325d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
325e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
325f0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
32600 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
32610 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
32620 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32630 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
32640 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32650 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
32660 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32670 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
32680 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
32690 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
326a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
326b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
326c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
326d0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
326e0 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
326f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
32700 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
32710 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
32720 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
32730 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
32740 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32750 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
32760 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
32770 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
32780 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
32790 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
327a0 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
327b0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
327c0 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
327d0 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
327e0 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
327f0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
32800 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
32810 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
32820 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
32830 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
32840 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
32850 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
32860 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
32870 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32880 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
32890 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
328a0 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
328b0 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
328c0 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
328d0 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
328e0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
328f0 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
32900 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
32910 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
32920 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
32930 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
32940 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
32950 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
32960 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
32970 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
32980 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
32990 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
329a0 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
329b0 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
329c0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
329d0 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
329e0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
329f0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32a00 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
32a10 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
32a20 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
32a30 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
32a40 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
32a50 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
32a60 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
32a70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
32a80 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
32a90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
32aa0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
32ab0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
32ac0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32ad0 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
32ae0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32af0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32b00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32b10 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
32b20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
32b30 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
32b40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32b50 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
32b60 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
32b70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
32b80 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
32b90 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
32ba0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
32bb0 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
32bc0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
32bd0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
32be0 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
32bf0 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
32c00 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
32c10 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
32c20 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
32c30 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
32c40 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
32c50 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
32c60 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
32c70 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
32c80 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
32c90 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
32ca0 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
32cb0 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
32cc0 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
32cd0 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
32ce0 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
32cf0 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
32d00 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
32d10 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
32d20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
32d30 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
32d40 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
32d50 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
32d60 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
32d70 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
32d80 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
32d90 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
32da0 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
32db0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
32dc0 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
32dd0 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
32de0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
32df0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
32e00 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
32e10 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
32e20 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
32e30 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
32e40 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
32e50 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
32e60 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
32e70 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
32e80 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
32e90 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
32ea0 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
32eb0 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
32ec0 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
32ed0 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
32ee0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
32ef0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
32f00 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
32f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
32f20 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
32f30 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
32f40 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
32f50 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
32f60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32f70 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
32f80 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
32f90 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
32fa0 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
32fb0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
32fc0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
32fd0 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
32fe0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
32ff0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
33000 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33010 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33020 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33030 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33040 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33060 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
33070 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33080 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33090 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
330a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
330b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
330c0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
330d0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
330e0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
330f0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
33100 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
33110 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
33120 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33130 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
33140 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
33150 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
33160 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
33170 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
33180 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
33190 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
331a0 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
331b0 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
331c0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
331d0 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
331e0 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
331f0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
33200 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
33210 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
33220 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
33230 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
33240 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
33250 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
33260 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
33270 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
33280 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
33290 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
332a0 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
332b0 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
332c0 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
332d0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
332e0 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
332f0 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
33300 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
33310 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
33320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33330 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33340 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
33350 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33360 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
33370 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
33380 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
33390 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
333a0 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
333b0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
333c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
333d0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
333e0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
333f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33400 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
33410 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
33420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33430 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
33440 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
33450 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
33460 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
33470 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
33480 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
33490 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
334a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
334b0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
334c0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
334d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
334e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
334f0 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
33500 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33510 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
33520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33530 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
33540 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
33550 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
33560 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
33570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33580 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
33590 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
335a0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
335b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
335c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
335d0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
335e0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
335f0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
33600 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
33610 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33620 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
33630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33640 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
33650 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
33660 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
33670 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
33680 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
33690 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
336a0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
336b0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
336c0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
336d0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
336e0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
336f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
33700 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
33710 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
33720 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
33730 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
33740 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
33750 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
33760 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
33770 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
33780 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
33790 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
337a0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
337b0 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
337c0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
337d0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
337e0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
337f0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
33800 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
33810 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
33820 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68 20 74  r methods each t
33830 72 79 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ry to acquire a 
33840 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a  reference to a.*
33850 2a 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  * page with page
33860 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 49 66   number pgno. If
33870 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
33880 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
33890 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
338a0 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
338b0 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
338c0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
338d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
338e0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
338f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
33900 20 6f 66 20 74 68 65 20 67 65 74 74 65 72 20 6d   of the getter m
33910 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e 67 0a  ethod depending.
33920 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
33930 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  t state of the p
33940 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ager..**.**     
33950 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 29 20  getPageNormal() 
33960 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68 65 20          --  The 
33970 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a 2a 2a  normal getter.**
33980 20 20 20 20 20 67 65 74 50 61 67 65 45 72 72 6f       getPageErro
33990 72 28 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20  r()          -- 
339a0 20 55 73 65 64 20 69 66 20 74 68 65 20 70 61 67   Used if the pag
339b0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
339c0 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 20 67  r state.**     g
339d0 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20 20 20  etPageMmap()    
339e0 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
339f0 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  if memory-mapped
33a00 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 0a   I/O is enabled.
33a10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
33a20 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
33a30 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33a40 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
33a50 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
33a60 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
33a70 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
33a80 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
33a90 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
33aa0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
33ab0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
33ac0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
33ad0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
33ae0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
33af0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
33b00 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
33b10 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
33b20 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
33b30 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
33b40 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
33b50 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
33b60 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
33b70 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
33b80 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
33b90 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
33ba0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
33bb0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
33bc0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
33bd0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
33be0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
33bf0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
33c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33c10 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
33c20 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
33c30 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
33c40 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
33c50 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
33c60 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
33c70 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
33c80 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
33c90 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
33ca0 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20 74 68  age or if .** th
33cb0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
33cc0 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50  r contains the P
33cd0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
33ce0 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65 20 0a  NT bit and the .
33cf0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
33d00 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
33d10 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
33d20 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
33d30 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
33d40 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
33d50 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
33d60 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
33d70 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
33d80 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
33d90 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
33da0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
33db0 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69 74 20  ENT is true, it 
33dc0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
33dd0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
33de0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
33df0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
33e00 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
33e10 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
33e20 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
33e30 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
33e40 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
33e50 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
33e60 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
33e70 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
33e80 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
33e90 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
33ea0 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
33eb0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
33ec0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
33ed0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
33ee0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
33ef0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
33f00 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
33f10 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   If PAGER_GET_NO
33f20 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c  CONTENT is true,
33f30 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
33f40 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
33f50 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  d instead.** of 
33f60 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
33f70 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
33f80 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
33f90 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
33fa0 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
33fb0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33fc0 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
33fd0 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
33fe0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
33ff0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
34000 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34010 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
34020 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
34030 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
34040 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
34050 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
34060 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
34070 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
34080 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
34090 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
340a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
340b0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
340c0 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
340d0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
340e0 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
340f0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
34100 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
34110 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
34120 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
34130 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
34140 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
34150 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
34160 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
34170 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
34180 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
34190 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
341a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
341b0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
341c0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
341d0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
341e0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
341f0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
34200 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
34210 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
34220 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
34230 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
34240 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
34250 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
34260 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
34270 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
34280 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
34290 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
342a0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
342b0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
342c0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
342d0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
342e0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
342f0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
34300 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
34310 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
34320 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
34330 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
34340 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
34350 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
34360 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
34370 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
34380 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
34390 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
343a0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
343b0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
343c0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
343d0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
343e0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
343f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34400 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
34410 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
34420 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
34430 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
34440 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34450 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
34460 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e  *pPg;.  u8 noCon
34470 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  tent;           
34480 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34490 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  if PAGER_GET_NOC
344a0 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20 2a 2f  ONTENT is set */
344b0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
344c0 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 0a  e_page *pBase;..
344d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
344e0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
344f0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
34500 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34510 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
34520 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
34530 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
34540 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
34550 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
34560 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
34570 20 29 3b 0a 0a 20 20 70 42 61 73 65 20 3d 20 73   );..  pBase = s
34580 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34590 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
345a0 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 69  e, pgno, 3);.  i
345b0 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
345c0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20     pPg = 0;.    
345d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
345e0 68 65 46 65 74 63 68 53 74 72 65 73 73 28 70 50  heFetchStress(pP
345f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34600 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20  gno, &pBase);.  
34610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34620 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
34630 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34640 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29    if( pBase==0 )
34650 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
34660 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
34670 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34680 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34690 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20    }.  }.  pPg = 
346a0 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65  *ppPage = sqlite
346b0 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
346c0 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
346d0 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73 65 29  he, pgno, pBase)
346e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 3d  ;.  assert( pPg=
346f0 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20  =(*ppPage) );.  
34700 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
34710 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
34720 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
34730 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
34740 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
34750 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c   noContent = (fl
34760 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
34770 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b 0a 20  NOCONTENT)!=0;. 
34780 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72   if( pPg->pPager
34790 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
347a0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
347b0 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
347c0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
347d0 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
347e0 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
347f0 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
34800 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
34810 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
34820 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
34830 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
34840 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
34850 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
34860 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
34870 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
34880 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
34890 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
348a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
348b0 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
348c0 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
348d0 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
348e0 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
348f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 42 75   initialized. Bu
34900 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65 72 72  t first some err
34910 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20 20 2a  or checks:.    *
34920 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 4d 69 6e  *.    ** (1) Min
34930 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
34940 20 69 73 20 31 0a 20 20 20 20 2a 2a 20 28 32 29   is 1.    ** (2)
34950 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34960 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34970 0a 20 20 20 20 2a 2a 20 28 33 29 20 4e 65 76 65  .    ** (3) Neve
34980 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
34990 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
349a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
349b0 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3e 50  gno==0 || pgno>P
349c0 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
349d0 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
349e0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
349f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34a00 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
34a10 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34a20 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34a30 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50    }..    pPg->pP
34a40 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
34a50 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
34a60 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
34a70 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  || !MEMDB );.   
34a80 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
34a90 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
34aa0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20  er->dbSize<pgno 
34ab0 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  || noContent ){.
34ac0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
34ad0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
34ae0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
34af0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
34b00 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34b10 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
34b30 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
34b40 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
34b50 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
34b60 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
34b70 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
34b80 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
34b90 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
34ba0 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
34bb0 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
34bc0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
34bd0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
34be0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
34bf0 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
34c00 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
34c10 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
34c20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
34c30 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
34c40 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
34c50 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
34c60 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
34c70 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
34c80 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
34c90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
34ca0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
34cb0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
34cc0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
34cd0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
34ce0 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
34cf0 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
34d00 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
34d10 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
34d20 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
34d30 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
34d40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
34d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34d60 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34d70 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
34d80 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
34d90 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
34da0 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
34db0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
34dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
34dd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
34de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
34df0 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c  mset(pPg->pData,
34e00 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
34e10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f 54  Size);.      IOT
34e20 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
34e30 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
34e40 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
34e50 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
34e60 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
34e70 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
34e80 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c  to read from WAL
34e90 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69   file */.      i
34ea0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
34eb0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
34ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
34ed0 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
34ee0 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
34ef0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
34f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34f10 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34f20 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34f30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
34f40 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34f50 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
34f60 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
34f70 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
34f80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
34f90 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
34fa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
34fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34fc0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
34fd0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
34fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
34ff0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
35000 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
35010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35020 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75 69  OK;..pager_acqui
35030 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72 74  re_err:.  assert
35040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35050 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  );.  if( pPg ){.
35060 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
35070 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a  eDrop(pPg);.  }.
35080 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
35090 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
350a0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
350b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
350c0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
350d0 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20  P_SIZE>0./* The 
350e0 70 61 67 65 20 67 65 74 74 65 72 20 66 6f 72 20  page getter for 
350f0 77 68 65 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  when memory-mapp
35100 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65  ed I/O is enable
35110 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
35120 67 65 74 50 61 67 65 4d 4d 61 70 28 0a 20 20 50  getPageMMap(.  P
35130 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
35140 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
35150 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
35160 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
35170 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
35180 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
35190 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
351a0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
351b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
351c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
351d0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
351e0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
351f0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
35200 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
35210 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35220 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
35230 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61   = 0;.  u32 iFra
35240 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  me = 0;         
35250 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65          /* Frame
35260 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41   to read from WA
35270 4c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  L file */..  /* 
35280 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c 65  It is acceptable
35290 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d 6f   to use a read-o
352a0 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65 20  nly (mmap) page 
352b0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78 63  for any page exc
352c0 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31 20  ept.  ** page 1 
352d0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  if there is no w
352e0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
352f0 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43 51   open or the ACQ
35300 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  UIRE_READONLY.  
35310 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  ** flag was spec
35320 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61 6c  ified by the cal
35330 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67  ler. And so long
35340 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e 6f   as the db is no
35350 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  t a .  ** tempor
35360 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ary or in-memory
35370 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
35380 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70   const int bMmap
35390 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20  Ok = (pgno>1.   
353a0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
353b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
353c0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47   || (flags & PAG
353d0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29  ER_GET_READONLY)
353e0 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ).  );..  assert
353f0 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  ( USEFETCH(pPage
35400 72 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  r) );.#ifdef SQL
35410 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
35420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35430 78 43 6f 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e  xCodec==0 );.#en
35440 64 69 66 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69  dif..  /* Optimi
35450 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64  zation note:  Ad
35460 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d  ding the "pgno<=
35470 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65 20 22  1" term before "
35480 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20  pgno==0" here.  
35490 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  ** allows the co
354a0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72  mpiler optimizer
354b0 20 74 6f 20 72 65 75 73 65 20 74 68 65 20 72 65   to reuse the re
354c0 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22 70 67  sults of the "pg
354d0 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73 74 20  no>1".  ** test 
354e0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
354f0 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61  statement, and a
35500 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70 67 6e  void testing pgn
35510 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a  o==0 in the.  **
35520 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
35530 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65  re pgno is large
35540 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c  . */.  if( pgno<
35550 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b  =1 && pgno==0 ){
35560 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35570 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35580 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
35590 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
355a0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
355b0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
355c0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
355d0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
355e0 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
355f0 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
35600 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35610 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
35620 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
35630 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72  bMmapOk && pager
35640 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
35650 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
35660 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
35670 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
35680 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
35690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
356a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
356b0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
356c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
356d0 20 20 7d 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f    }.  if( bMmapO
356e0 6b 20 26 26 20 69 46 72 61 6d 65 3d 3d 30 20 29  k && iFrame==0 )
356f0 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  {.    void *pDat
35700 61 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  a = 0;.    rc = 
35710 73 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70  sqlite3OsFetch(p
35720 50 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20  Pager->fd, .    
35730 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31      (i64)(pgno-1
35740 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
35750 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61  Size, pPager->pa
35760 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20  geSize, &pData. 
35770 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
35780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
35790 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 69 66  Data ){.      if
357a0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
357b0 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  >PAGER_READER ||
357c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
357d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  e ){.        pPg
357e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
357f0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
35800 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
35810 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
35820 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
35830 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
35840 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  e(pPager, pgno, 
35850 70 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20  pData, &pPg);.  
35860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35870 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
35880 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
35890 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61  i64)(pgno-1)*pPa
358a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
358b0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
358c0 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a       if( pPg ){.
358d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
358e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
358f0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
35900 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
35910 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
35930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
35940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
35950 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
35960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
35970 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
35980 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50  getPageNormal(pP
35990 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
359a0 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65  ge, flags);.}.#e
359b0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
359c0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
359d0 2f 0a 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67  /../* The page g
359e0 65 74 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72  etter method for
359f0 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
35a00 69 73 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  is an error stat
35a10 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
35a20 67 65 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20  getPageError(.  
35a30 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
35a40 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
35a50 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
35a60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
35a70 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
35a80 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
35a90 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
35aa0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
35ab0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
35ac0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35ad0 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
35ae0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
35af0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
35b00 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
35b10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
35b20 52 28 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45  R(pgno);.  UNUSE
35b30 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
35b40 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  s);.  assert( pP
35b50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
35b60 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
35b70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
35b80 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35b90 6f 64 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70  ode;.}.../* Disp
35ba0 61 74 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65  atch all page fe
35bb0 74 63 68 20 72 65 71 75 65 73 74 73 20 74 6f 20  tch requests to 
35bc0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
35bd0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a  getter method..*
35be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
35bf0 65 72 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a  erGet(.  Pager *
35c00 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
35c10 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
35c20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35c30 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
35c40 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
35c50 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
35c60 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
35c70 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
35c80 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
35c90 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
35ca0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
35cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
35cc0 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
35cd0 73 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  s */.){.  return
35ce0 20 70 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50   pPager->xGet(pP
35cf0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61  ager, pgno, ppPa
35d00 67 65 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f  ge, flags);.}../
35d10 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
35d20 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
35d30 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
35d40 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
35d50 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
35d60 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
35d70 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
35d80 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
35d90 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
35da0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
35db0 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20  che. .**.** See 
35dc0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
35dd0 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
35de0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
35df0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
35e00 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
35e10 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
35e20 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
35e30 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
35e40 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
35e50 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
35e60 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
35e70 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
35e80 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
35e90 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
35ea0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
35eb0 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
35ec0 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
35ed0 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
35ee0 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
35ef0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
35f00 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
35f10 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33  pgno){.  sqlite3
35f20 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50  _pcache_page *pP
35f30 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
35f40 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
35f50 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
35f60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35f70 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b  r->pPCache!=0 );
35f80 0a 20 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74  .  pPage = sqlit
35f90 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
35fa0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
35fb0 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  gno, 0);.  asser
35fc0 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70  t( pPage==0 || p
35fd0 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
35fe0 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66  aredLock );.  if
35ff0 28 20 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( pPage==0 ) ret
36000 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
36010 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
36020 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
36030 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
36040 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
36050 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
36060 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
36070 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
36080 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
36090 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
360a0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
360b0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
360c0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
360d0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
360e0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
360f0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
36100 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
36110 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
36120 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
36130 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
36140 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
36150 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
36160 75 6c 6c 28 44 62 50 61 67 65 20 2a 70 50 67 29  ull(DbPage *pPg)
36170 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
36180 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  r;.  assert( pPg
36190 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 20  !=0 );.  pPager 
361a0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
361b0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20   if( pPg->flags 
361c0 26 20 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a  & PGHDR_MMAP ){.
361d0 20 20 20 20 70 61 67 65 72 52 65 6c 65 61 73 65      pagerRelease
361e0 4d 61 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20  MapPage(pPg);.  
361f0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
36200 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
36210 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
36220 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
36230 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20  pPager);.}.void 
36240 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
36250 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
36260 20 20 69 66 28 20 70 50 67 20 29 20 73 71 6c 69    if( pPg ) sqli
36270 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
36280 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  Null(pPg);.}../*
36290 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
362a0 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74  n is called at t
362b0 68 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72  he start of ever
362c0 79 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  y write transact
362d0 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ion..** There mu
362e0 73 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  st already be a 
362f0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
36300 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
36310 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
36320 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
36330 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
36340 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  .**.** Open the 
36350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
36360 20 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e   pager pPager an
36370 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61  d write a journa
36380 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74  l header.** to t
36390 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20  he start of it. 
363a0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
363b0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20  ive savepoints, 
363c0 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75  open the sub-jou
363d0 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e  rnal.** as well.
363e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
363f0 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e  s only used when
36400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36410 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f  e is being .** o
36420 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61  pened to write a
36430 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f   rollback log fo
36440 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  r a transaction.
36450 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20   It is not used 
36460 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  .** when opening
36470 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66   a hot journal f
36480 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ile to roll it b
36490 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
364a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
364b0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28  s already open (
364c0 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  as it may be in 
364d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c  exclusive mode),
364e0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75  .** then this fu
364f0 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74  nction just writ
36500 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61  es a journal hea
36510 64 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  der to the start
36520 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61   of the.** alrea
36530 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a  dy open file. .*
36540 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
36550 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
36560 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62  file is opened b
36570 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  y this function,
36580 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49   the.** Pager.pI
36590 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
365a0 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
365b0 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  ocated..**.** Re
365c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
365d0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
365e0 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65  successful. Othe
365f0 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a  rwise, return .*
36600 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
36610 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  f the attempt to
36620 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e   allocate Pager.
36630 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  pInJournal fails
36640 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65  , or .** an IO e
36650 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65  rror code if ope
36660 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ning or writing 
36670 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36680 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
36690 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
366a0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
366b0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
366c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
366f0 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
36700 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
36710 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
36720 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  s;   /* Local ca
36730 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74  che of vfs point
36740 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
36750 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
36760 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
36770 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CKED );.  assert
36780 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
36790 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
367a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
367b0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
367c0 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c  );.  .  /* If al
367d0 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
367e0 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  or state, this f
367f0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
36800 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a  op.  But on.  **
36810 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
36820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
36830 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66   never called if
36840 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
36850 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  in.  ** an error
36860 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28   state. */.  if(
36870 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65   NEVER(pPager->e
36880 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e  rrCode) ) return
36890 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
368a0 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  ;..  if( !pagerU
368b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
368c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
368d0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
368e0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
368f0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
36900 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
36910 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
36920 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20  er->dbSize);.   
36930 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e   if( pPager->pIn
36940 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
36950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36960 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
36970 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70    }.  .    /* Op
36980 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
36990 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ile if it is not
369a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a   already open. *
369b0 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  /.    if( !isOpe
369c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
369d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
369e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
369f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
36a00 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
36a10 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
36a20 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
36a30 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d  r->jfd);.      }
36a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
36a50 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  t flags = SQLITE
36a60 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
36a70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
36a80 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  TE;.        int 
36a90 6e 53 70 69 6c 6c 3b 0a 0a 23 69 66 20 53 51 4c  nSpill;..#if SQL
36aa0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
36ab0 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
36ac0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 70 50 61     flags |= (pPa
36ad0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51  ger->vfsFlags&SQ
36ae0 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52  LITE_OPEN_FILEPR
36af0 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a  OTECTION_MASK);.
36b00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
36b10 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
36b20 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ile ){.         
36b30 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54   flags |= (SQLIT
36b40 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
36b50 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
36b60 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _TEMP_JOURNAL);.
36b70 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c            nSpill
36b80 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
36b90 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
36ba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36bb0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53        flags |= S
36bc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
36bd0 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
36be0 20 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c     nSpill = jrnl
36bf0 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
36c00 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
36c10 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
36c20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
36c30 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
36c40 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
36c50 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
36c60 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
36c70 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
36c80 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
36c90 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
36ca0 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
36cb0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
36cc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36cd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
36ce0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
36cf0 65 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20  en (.           
36d00 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
36d10 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
36d20 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  r->jfd, flags, n
36d30 53 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20  Spill.          
36d40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36d50 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
36d60 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
36d70 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
36d80 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d  r->jfd) );.    }
36d90 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72  .  .  .    /* Wr
36da0 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ite the first jo
36db0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
36dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36dd0 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a   and open .    *
36de0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
36df0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
36e00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
36e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36e20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43        /* TODO: C
36e30 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74  heck if all of t
36e40 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20  hese are really 
36e50 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
36e60 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
36e70 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
36e80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
36e90 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
36ea0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
36eb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36ec0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
36ed0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
36ee0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
36ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
36f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36f10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
36f20 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
36f30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
36f40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
36f50 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
36f60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
36f70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
36f80 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36f90 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50  LOCKED );.    pP
36fa0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
36fb0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
36fc0 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  EMOD;.  }..  ret
36fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
36fe0 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74   Begin a write-t
36ff0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
37000 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
37010 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a  r object. If a .
37020 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
37030 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37040 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68   been opened, th
37050 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
37060 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
37070 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75   the exFlag argu
37080 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74  ment is false, t
37090 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
370a0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a  east a RESERVED.
370b0 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ** lock on the d
370c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
370d0 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
370e0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
370f0 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43   least.** an EXC
37100 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
37110 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61  such a lock is a
37120 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20  lready held, no 
37130 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63  locking .** func
37140 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61  tions need be ca
37150 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lled..**.** If t
37160 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
37170 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
37180 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73  zero, then any s
37190 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65  ub-journal opene
371a0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  d.** within this
371b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
371c0 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61  l be opened as a
371d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
371e0 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f  . This.** has no
371f0 20 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73   effect if the s
37200 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c  ub-journal is al
37210 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73  ready opened (as
37220 20 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a   it may be when.
37230 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ** running in ex
37240 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72  clusive mode) or
37250 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
37260 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  ion does not req
37270 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f  uire a.** sub-jo
37280 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75  urnal. If the su
37290 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
372a0 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ent is zero, the
372b0 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a  n any required.*
372c0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  * sub-journal is
372d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d   implemented in-
372e0 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72  memory if pPager
372f0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
37300 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f   database, .** o
37310 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72  r using a tempor
37320 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69  ary file otherwi
37330 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
37340 65 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67  e3PagerBegin(Pag
37350 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
37360 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a  exFlag, int subj
37370 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74  InMemory){.  int
37380 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37390 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
373a0 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
373b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
373c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
373d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
373e0 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
373f0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
37400 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67  _ERROR );.  pPag
37410 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
37420 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d   = (u8)subjInMem
37430 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41  ory;..  if( ALWA
37440 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  YS(pPager->eStat
37450 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29  e==PAGER_READER)
37460 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
37470 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37480 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66  al==0 );..    if
37490 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
374a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f  ager) ){.      /
374b0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
374c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
374d0 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  use locking_mode
374e0 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20  =exclusive, and 
374f0 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c  an.      ** excl
37500 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
37510 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
37520 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  t already held, 
37530 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20  obtain it now.. 
37540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
37550 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
37560 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74  iveMode && sqlit
37570 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
37580 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
37590 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20   -1) ){.        
375a0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
375b0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
375c0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
375d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
375e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
375f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
37600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76      }.        (v
37610 6f 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78  oid)sqlite3WalEx
37620 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
37630 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
37640 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
37650 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
37660 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
37670 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
37680 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
37690 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
376a0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
376b0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
376c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
376d0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
376e0 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
376f0 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
37700 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
37710 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
37720 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
37730 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
37740 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
37750 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
37760 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
37770 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
37780 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  = sqlite3WalBegi
37790 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
377a0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
377b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
377c0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45    /* Obtain a RE
377d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
377e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
377f0 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  . If the exFlag 
37800 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20  parameter.      
37810 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
37820 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
37830 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
37840 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
37850 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73  The.      ** bus
37860 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
37870 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
37880 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
37890 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
378a0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75       ** lock, bu
378b0 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69  t not when obtai
378c0 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45  ning the RESERVE
378d0 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  D lock..      */
378e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
378f0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
37900 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
37910 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
37920 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61  LITE_OK && exFla
37930 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
37940 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
37950 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
37960 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
37970 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
37980 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  OK ){.      /* C
379a0 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f  hange to WRITER_
379b0 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20  LOCKED state..  
379c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
379d0 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
379e0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41  ger.eState to PA
379f0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37a00 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20  D or CACHEMOD.  
37a10 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68      ** when it h
37a20 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73  as an open trans
37a30 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65  action, but neve
37a40 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49  r to DBMOD or FI
37a50 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a  NISHED..      **
37a60 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
37a70 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73   in those states
37a80 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
37a90 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74  l back savepoint
37aa0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
37ab0 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79  actions may copy
37ac0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73   data from the s
37ad0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ub-journal into 
37ae0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
37af0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77      ** file as w
37b00 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20  ell as into the 
37b10 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63  page cache. Whic
37b20 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72  h would be incor
37b30 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a  rect in .      *
37b40 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20  * WAL mode..    
37b50 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
37b60 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
37b70 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b  R_WRITER_LOCKED;
37b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
37b90 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
37ba0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
37bb0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
37bc0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
37bd0 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
37be0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
37bf0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
37c00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
37c10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
37c20 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
37c30 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
37c40 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37c50 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
37c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
37c80 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37c90 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37ca0 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65  CKED );.    asse
37cb0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37cc0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37cd0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
37ce0 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE(("TRANSACTIO
37cf0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
37d00 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65  (pPager)));.  re
37d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37d20 2a 20 57 72 69 74 65 20 70 61 67 65 20 70 50 67  * Write page pPg
37d30 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
37d40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
37d50 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
37d60 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
37d70 20 69 6e 74 20 70 61 67 65 72 41 64 64 50 61 67   int pagerAddPag
37d80 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  eToRollbackJourn
37d90 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
37da0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
37db0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
37dc0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 63   int rc;.  u32 c
37dd0 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a 70 44  ksum;.  char *pD
37de0 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f 66 66  ata2;.  i64 iOff
37df0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
37e00 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 65 20  alOff;..  /* We 
37e10 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
37e20 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
37e30 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
37e40 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  that.  ** contai
37e50 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
37e60 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
37e70 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
37e80 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ifies.  ** that 
37e90 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
37ea0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
37eb0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
37ec0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
37ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
37ee0 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65  ournalHdr<=pPage
37ef0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
37f00 0a 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72  .  CODEC2(pPager
37f10 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
37f20 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
37f30 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
37f40 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20  BKPT, pData2);. 
37f50 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
37f60 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
37f70 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a  *)pData2);..  /*
37f80 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
37f90 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
37fa0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
37fb0 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
37fc0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
37fd0 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
37fe0 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
37ff0 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
38000 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
38010 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
38020 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
38030 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
38040 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b  in.  ** playback
38050 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
38060 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
38070 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
38080 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69   restored.  ** i
38090 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
380a0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
380b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
380c0 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
380d0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
380e0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
380f0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
38100 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
38110 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72  SYNC;..  rc = wr
38120 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
38130 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
38140 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72  ->pgno);.  if( r
38150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
38160 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
38170 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
38180 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
38190 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
381a0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
381b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
381c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
381d0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
381e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
381f0 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
38200 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
38210 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
38220 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
38230 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22  c;..  IOTRACE(("
38240 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
38250 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
38260 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
38270 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
38280 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
38290 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
382a0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
382b0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
382c0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54  count);.  PAGERT
382d0 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
382e0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
382f0 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
38300 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45  \n",.       PAGE
38310 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
38320 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
38330 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
38340 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
38350 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
38360 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50  sh(pPg)));..  pP
38370 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
38380 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
38390 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
383a0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73  er->nRec++;.  as
383b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
383c0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
383d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
383e0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
383f0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
38400 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
38410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
38420 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MEM );.  assert(
38430 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
38440 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
38450 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64  EM );.  rc |= ad
38460 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
38470 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
38480 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74  >pgno);.  assert
38490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
384a0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
384b0 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
384c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
384d0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
384e0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
384f0 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
38500 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
38510 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
38520 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
38530 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
38540 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
38550 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
38560 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
38570 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
38580 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
38590 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
385a0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
385b0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
385c0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
385d0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
385e0 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
385f0 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
38600 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
38610 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
38620 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
38630 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38640 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
38650 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
38660 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
38670 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
38680 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
38690 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
386a0 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
386b0 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
386c0 68 65 20 6a