/ Hex Artifact Content
Login

Artifact fcdfc9ef832281c49870ac703ecb317fbea93891:


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 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
19480 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
19490 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
194a0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
194b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
194c0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
194d0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
194e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
194f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
19500 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
19510 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
19520 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
19530 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
19540 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
19550 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
19560 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
19570 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
19580 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
19590 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
195a0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
195b0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
195c0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
195d0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
195e0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
195f0 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
19600 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
19610 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
19620 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
19630 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
19640 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
19650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19660 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
19670 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
19680 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
19690 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
196a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
196b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d  sqlite3Malloc(nM
196c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
196d0 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
196e0 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
196f0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
19700 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
19710 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  KPT;.    goto de
19720 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
19730 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
19740 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
19750 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
19760 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
19770 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
19780 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
19790 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
197a0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
197b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
197c0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
197d0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
197e0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
197f0 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
19800 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
19810 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
19820 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
19830 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
19840 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
19850 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
19860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
19870 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
19880 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
19890 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
198a0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
198b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
198c0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
198d0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
198e0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
198f0 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
19900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
19910 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
19920 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
19930 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
19940 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
19950 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
19960 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
19970 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
19980 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
19990 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
199a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
199b0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
199c0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
199d0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
199e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
199f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
19a00 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
19a10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19a20 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
19a30 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
19a40 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
19a50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19a60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19a70 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19a80 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19a90 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
19aa0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
19ab0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
19ac0 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
19ad0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
19ae0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
19af0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19b10 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19b20 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
19b30 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
19b40 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
19b50 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
19b60 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
19b70 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
19b80 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
19b90 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
19ba0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
19bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
19bc0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19bd0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
19bf0 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
19c00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
19c10 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
19c20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19c30 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
19c40 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
19c50 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
19c60 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
19c70 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
19c80 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
19c90 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
19ca0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
19cb0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
19cc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
19cd0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
19ce0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19cf0 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
19d00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19d10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
19d20 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
19d30 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
19d40 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
19d50 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
19d60 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
19d70 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
19d80 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
19d90 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
19da0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
19db0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
19dc0 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
19dd0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
19de0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
19df0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
19e00 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
19e10 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
19e20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
19e30 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
19e40 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
19e50 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
19e60 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
19e70 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
19e80 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
19e90 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
19ea0 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
19eb0 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
19ec0 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
19ed0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
19ee0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
19ef0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
19f00 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
19f10 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
19f20 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
19f30 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
19f40 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
19f50 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
19f60 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
19f70 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
19f80 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
19f90 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
19fa0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
19fb0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
19fc0 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
19fd0 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
19fe0 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
19ff0 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
1a000 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1a010 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
1a020 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
1a030 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
1a040 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
1a050 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
1a060 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
1a070 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
1a080 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1a090 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
1a0a0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
1a0b0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1a0c0 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
1a0d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a0e0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
1a0f0 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
1a100 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1a110 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
1a120 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1a130 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
1a140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1a150 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1a160 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1a170 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1a180 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a190 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
1a1a0 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
1a1b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a1c0 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
1a1d0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1a1e0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1a1f0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1a200 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
1a210 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
1a220 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
1a230 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
1a240 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
1a250 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
1a260 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
1a270 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1a280 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
1a290 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
1a2a0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
1a2b0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
1a2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1a2d0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1a2e0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
1a2f0 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
1a300 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
1a310 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
1a320 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
1a330 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
1a340 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
1a350 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
1a360 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1a370 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
1a380 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
1a390 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
1a3a0 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
1a3b0 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
1a3c0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1a3d0 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
1a3e0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1a3f0 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
1a400 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
1a410 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1a420 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1a430 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
1a440 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1a450 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1a460 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
1a470 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1a480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a490 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1a4a0 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
1a4b0 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
1a4c0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1a4d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a4e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a4f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1a500 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
1a510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1a520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a530 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
1a540 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
1a550 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
1a560 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
1a570 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
1a580 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
1a590 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
1a5a0 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
1a5b0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
1a5c0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
1a5d0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1a5e0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
1a5f0 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
1a600 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
1a610 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
1a620 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
1a630 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
1a640 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
1a650 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
1a660 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
1a670 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
1a680 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
1a690 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
1a6a0 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
1a6b0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
1a6c0 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
1a6d0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1a6e0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
1a6f0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
1a700 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
1a710 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1a720 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
1a730 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
1a740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a750 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
1a760 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
1a770 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1a780 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
1a790 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
1a7a0 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
1a7b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
1a7c0 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
1a7d0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
1a7e0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
1a7f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
1a800 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a810 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
1a820 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
1a830 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
1a840 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
1a850 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
1a860 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a870 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
1a880 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1a890 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
1a8a0 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
1a8b0 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
1a8c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
1a8d0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
1a8e0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
1a8f0 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
1a900 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
1a910 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1a920 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1a930 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f   has the SQLITE_
1a940 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1a950 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72  OVERWRITE proper
1a960 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ty, then set.** 
1a970 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a980 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73  ctor size to its
1a990 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28   minimum value (
1a9a0 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f  512).  The purpo
1a9b0 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d  se of.** pPager-
1a9c0 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74  >sectorSize is t
1a9d0 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c  o define the "bl
1a9e0 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62  ast radius" of b
1a9f0 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67  ytes that.** mig
1aa00 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63  ht change if a c
1aa10 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c  rash occurs whil
1aa20 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73  e writing to a s
1aa30 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a  ingle byte in.**
1aa40 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75   that range.  Bu
1aa50 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45  t with POWERSAFE
1aa60 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20  _OVERWRITE, the 
1aa70 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20  blast radius is 
1aa80 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73  zero.** (that is
1aa90 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f   what POWERSAFE_
1aaa0 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29  OVERWRITE means)
1aab0 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65  , so we minimize
1aac0 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73   the sector.** s
1aad0 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ize.  For backwa
1aae0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1aaf0 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  y of the rollbac
1ab00 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  k journal file f
1ab10 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e  ormat,.** we can
1ab20 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65  not reduce the e
1ab30 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1ab40 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a  size below 512..
1ab50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1ab60 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
1ab70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
1ab80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1ab90 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1aba0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1abb0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1abc0 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28  tempFile.   || (
1abd0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1abe0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1abf0 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20  Pager->fd) & .  
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1ac10 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1ac20 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30  FE_OVERWRITE)!=0
1ac30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  .  ){.    /* Sec
1ac40 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
1ac50 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
1ac60 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
1ac70 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
1ac80 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
1ac90 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
1aca0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1acb0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
1acc0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
1acd0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ll segfault. */.
1ace0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1acf0 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
1ad00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1ad10 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1ad20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1ad30 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1ad40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
1ad50 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
1ad60 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
1ad70 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
1ad80 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
1ad90 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
1ada0 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
1adb0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
1adc0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
1add0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
1ade0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
1adf0 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
1ae00 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
1ae10 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
1ae20 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
1ae30 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1ae40 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1ae50 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1ae60 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
1ae70 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
1ae80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
1ae90 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
1aea0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1aeb0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
1aec0 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
1aed0 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
1aee0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
1aef0 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
1af00 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1af10 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1af20 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
1af30 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
1af40 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
1af50 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
1af60 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
1af70 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1af80 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
1af90 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
1afa0 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
1afb0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
1afc0 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
1afd0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1afe0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1aff0 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
1b000 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
1b010 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
1b020 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1b030 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
1b040 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b050 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
1b060 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
1b070 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
1b080 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
1b090 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
1b0a0 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
1b0b0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
1b0c0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
1b0d0 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
1b0e0 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
1b0f0 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
1b100 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
1b110 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
1b120 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
1b130 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
1b140 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
1b150 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
1b160 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
1b170 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
1b180 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
1b190 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
1b1a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
1b1b0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
1b1c0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
1b1d0 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
1b1e0 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
1b1f0 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
1b200 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
1b210 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
1b220 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
1b230 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
1b240 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
1b250 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b260 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
1b270 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
1b280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b290 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
1b2a0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
1b2b0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
1b2c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1b2d0 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
1b2e0 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
1b2f0 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
1b300 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b310 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
1b320 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
1b330 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
1b340 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
1b350 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
1b360 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
1b370 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
1b380 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1b390 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
1b3a0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
1b3b0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
1b3c0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
1b3d0 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
1b3e0 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
1b3f0 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
1b400 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1b410 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
1b420 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
1b430 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
1b440 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
1b450 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1b460 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
1b470 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
1b480 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
1b490 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
1b4a0 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
1b4b0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
1b4c0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1b4d0 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
1b4e0 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
1b4f0 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
1b500 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
1b510 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
1b520 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
1b530 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
1b540 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
1b550 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
1b560 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1b570 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
1b580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1b590 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1b5a0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1b5b0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
1b5c0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
1b5d0 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
1b5e0 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
1b5f0 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
1b600 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1b610 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
1b620 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
1b630 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
1b640 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
1b650 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
1b660 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
1b670 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
1b680 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
1b690 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
1b6a0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
1b6b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
1b6c0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
1b6d0 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
1b6e0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1b6f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1b700 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
1b710 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1b720 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
1b730 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
1b740 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
1b750 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
1b760 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
1b770 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
1b780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b790 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
1b7a0 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
1b7b0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
1b7c0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1b7d0 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
1b7e0 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
1b7f0 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
1b800 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
1b810 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
1b820 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
1b830 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b840 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
1b850 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
1b860 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
1b870 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1b880 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
1b890 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
1b8a0 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
1b8b0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1b8c0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
1b8d0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1b8e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b8f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b900 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1b910 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
1b920 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b930 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
1b940 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1b950 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
1b960 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1b970 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1b980 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
1b990 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b9a0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
1b9b0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
1b9c0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
1b9d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1b9e0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b9f0 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
1ba00 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
1ba10 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1ba20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
1ba30 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
1ba40 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
1ba50 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
1ba60 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ba70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ba80 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
1ba90 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
1baa0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
1bab0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
1bac0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
1bad0 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
1bae0 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20    int nPlayback 
1baf0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
1bb00 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1bb10 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ges restored fro
1bb20 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20  m journal */..  
1bb30 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1bb40 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
1bb50 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1bb60 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
1bb70 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
1bb80 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
1bb90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
1bba0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1bbb0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
1bbc0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1bbd0 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
1bbe0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bbf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
1bc00 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bc10 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
1bc20 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1bc30 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
1bc40 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
1bc50 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
1bc60 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1bc70 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
1bc80 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
1bc90 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
1bca0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
1bcb0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
1bcc0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
1bcd0 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
1bce0 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
1bcf0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a  ayed back..  **.
1bd00 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e    ** TODO: Techn
1bd10 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  ically the follo
1bd20 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72  wing is an error
1bd30 20 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75   because it assu
1bd40 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75  mes that.  ** bu
1bd50 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53  ffer Pager.pTmpS
1bd60 70 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e  pace is (mxPathn
1bd70 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20  ame+1) bytes or 
1bd80 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61  larger. i.e. tha
1bd90 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e  t.  ** (pPager->
1bda0 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67  pageSize >= pPag
1bdb0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1bdc0 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f  name+1). Using o
1bdd0 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d  s_unix.c,.  ** m
1bde0 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1bdf0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1be00 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1be10 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1be20 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1be30 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1be40 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1be50 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1be60 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1be70 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1be80 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1be90 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1bea0 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1beb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1bec0 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1bed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1bee0 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1bef0 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1bf00 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1bf10 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1bf20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1bf30 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1bf40 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1bf50 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1bf60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bf70 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1bf80 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1bf90 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1bfa0 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1bfb0 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1bfc0 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1bfd0 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1bfe0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1bff0 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1c000 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1c010 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1c020 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1c030 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1c040 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1c050 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1c060 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c070 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1c080 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1c090 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1c0a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c0b0 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1c0c0 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1c0d0 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1c0e0 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1c0f0 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1c100 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1c110 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1c120 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1c130 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1c140 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1c150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1c160 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1c170 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1c180 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1c190 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1c1a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1c1b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c1c0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c1d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c1e0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1c1f0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c200 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1c210 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1c220 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1c230 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1c240 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1c250 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1c260 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1c270 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1c280 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1c290 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1c2a0 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1c2b0 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1c2c0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1c2d0 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1c2e0 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1c2f0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1c300 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1c310 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1c320 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1c330 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1c340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c350 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1c360 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c370 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1c380 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1c390 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1c3a0 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1c3b0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1c3c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c3d0 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1c3e0 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1c3f0 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1c400 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1c410 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1c420 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1c430 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1c440 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1c450 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1c460 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1c470 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1c480 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1c490 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1c4a0 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1c4b0 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1c4c0 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1c4d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1c4e0 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1c4f0 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1c500 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1c510 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c520 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1c530 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1c540 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1c550 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1c560 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1c570 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1c580 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1c590 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1c5a0 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1c5b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1c5c0 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1c5d0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1c5e0 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1c5f0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1c600 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1c610 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1c620 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1c630 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1c640 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1c650 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c660 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1c670 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1c680 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1c690 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1c6a0 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1c6b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1c6c0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c6d0 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1c6e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1c6f0 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1c700 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1c710 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1c720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1c730 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1c740 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1c750 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1c760 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1c770 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1c780 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c790 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1c7a0 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1c7b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c7c0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c7d0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1c7e0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1c7f0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1c800 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1c810 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1c820 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1c830 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1c840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1c850 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1c860 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1c870 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1c880 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1c890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c8b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1c8c0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1c8d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1c8e0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1c8f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1c900 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1c910 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1c920 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1c930 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1c940 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1c950 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1c960 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1c970 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1c980 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1c990 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1c9a0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1c9b0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1c9c0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1c9d0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1c9e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1c9f0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1ca00 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1ca10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1ca20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ca30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ca40 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1ca50 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1ca60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ca70 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1ca80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ca90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1caa0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1cab0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1cac0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1cad0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1cae0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1caf0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1cb00 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1cb10 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1cb20 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1cb30 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1cb40 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1cb50 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1cb60 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1cb70 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1cb80 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1cb90 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1cba0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1cbb0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1cbc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1cbd0 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1cbe0 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1cbf0 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1cc00 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1cc10 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1cc20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1cc30 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1cc40 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1cc50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1cc60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1cc70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cc80 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1cc90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1cca0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1ccb0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1ccc0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1ccd0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1cce0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1ccf0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1cd00 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1cd10 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1cd20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1cd30 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1cd40 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1cd50 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1cd60 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1cd70 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1cd80 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1cd90 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1cda0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1cdb0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1cdc0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1cdd0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1cde0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cdf0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1ce00 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1ce10 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1ce20 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1ce30 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1ce40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce50 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1ce60 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1ce70 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1ce80 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1ce90 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1cea0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1ceb0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1cec0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1ced0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1cee0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1cef0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1cf00 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1cf10 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1cf20 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1cf30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1cf40 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1cf50 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1cf60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1cf70 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1cf80 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1cf90 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1cfa0 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1cfb0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1cfc0 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1cfd0 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1cfe0 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1cff0 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1d000 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1d010 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1d020 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1d030 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1d040 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1d050 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1d060 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1d070 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1d080 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1d090 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1d0a0 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1d0b0 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1d0c0 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1d0d0 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1d0e0 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1d0f0 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1d100 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1d110 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1d120 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1d130 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1d140 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1d150 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1d160 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1d170 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1d180 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1d190 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1d1a0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1d1b0 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1d1c0 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1d1d0 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1d1e0 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1d1f0 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1d200 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1d210 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1d220 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1d230 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1d240 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1d250 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1d260 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1d270 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1d280 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1d290 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1d2a0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1d2b0 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1d2c0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d2d0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d2e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d2f0 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1d300 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1d310 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1d320 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1d330 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1d340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d350 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c  agerSync(pPager,
1d360 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1d370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d380 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1d390 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1d3a0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1d3b0 5d 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20  ]!='\0', 0);.   
1d3c0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d3d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d3e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d3f0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1d400 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1d410 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1d420 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1d430 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1d440 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1d450 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1d460 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1d470 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1d480 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1d490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1d4a0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1d4b0 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1d4c0 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1d4d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d4e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48  );.  }.  if( isH
1d4f0 6f 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20  ot && nPlayback 
1d500 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
1d510 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
1d520 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
1d530 4b 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64  K, "recovered %d
1d540 20 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c   pages from %s",
1d550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d560 20 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67   nPlayback, pPag
1d570 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
1d580 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
1d590 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1d5a0 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
1d5b0 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
1d5c0 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
1d5d0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
1d5e0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1d5f0 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
1d600 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65  rent sector size
1d610 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73  .  ** value. Res
1d620 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72  et it to the cor
1d630 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74  rect value for t
1d640 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  his process..  *
1d650 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  /.  setSectorSiz
1d660 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
1d670 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1d680 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
1d690 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20  nt for page pPg 
1d6a0 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
1d6b0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74  ase file and int
1d6c0 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61  o .** pPg->pData
1d6d0 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  . A shared lock 
1d6e0 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20  or greater must 
1d6f0 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d700 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
1d710 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
1d720 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1d730 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20  **.** If page 1 
1d740 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68  is read, then th
1d750 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
1d760 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
1d770 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76   set to.** the v
1d780 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
1d790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d7a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
1d7b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1d7c0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1d7d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
1d7e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f  the caller..** O
1d7f0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1d800 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1d810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1d820 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20  eadDbPage(PgHdr 
1d830 2a 70 50 67 2c 20 75 33 32 20 69 46 72 61 6d 65  *pPg, u32 iFrame
1d840 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1d850 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1d860 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
1d870 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1d880 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
1d890 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
1d8a0 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
1d8b0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
1d8c0 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ead */.  int rc 
1d8d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1d8e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d8f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  code */.  int pg
1d900 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
1d910 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
1d920 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
1d930 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
1d940 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1d950 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
1d960 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
1d970 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1d980 72 2d 3e 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64  r->fd) );..#ifnd
1d990 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d9a0 41 4c 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20  AL.  if( iFrame 
1d9b0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
1d9c0 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
1d9d0 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
1d9e0 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
1d9f0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1da00 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1da10 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70  >pWal, iFrame, p
1da20 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61 74 61 29  gsz, pPg->pData)
1da30 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
1da40 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  .  {.    i64 iOf
1da50 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1da60 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1da70 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1da80 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1da90 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1daa0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1dab0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1dac0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1dad0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1dae0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1daf0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1db00 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1db10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1db20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1db30 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1db40 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1db50 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1db60 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1db70 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1db80 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1db90 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1dba0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1dbb0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1dbc0 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1dbd0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1dbe0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1dbf0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1dc00 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1dc10 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1dc20 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1dc30 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1dc40 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1dc50 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1dc60 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1dc70 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1dc80 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1dc90 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1dca0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1dcb0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1dcc0 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1dcd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1dce0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1dcf0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1dd00 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1dd10 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1dd20 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1dd30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1dd40 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1dd50 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1dd60 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1dd70 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71  * white noise eq
1dd80 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1dd90 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1dda0 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1ddb0 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1ddc0 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1ddd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1dde0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1ddf0 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1de00 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1de10 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1de20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1de30 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1de40 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1de50 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1de60 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1de70 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1de80 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1de90 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1dea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1deb0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1dec0 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1ded0 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1dee0 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41  MEM_BKPT);..  PA
1def0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1df00 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1df10 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1df20 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1df30 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1df40 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1df50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1df60 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1df70 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1df80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1df90 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1dfa0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1dfb0 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1dfc0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1dfd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1dfe0 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1dff0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1e000 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1e010 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1e020 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1e030 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1e040 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1e050 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1e060 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1e070 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1e080 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1e090 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1e0a0 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1e0b0 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1e0c0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1e0d0 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1e0e0 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1e0f0 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1e100 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1e110 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1e120 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1e130 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1e140 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1e150 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1e160 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1e170 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1e180 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1e190 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1e1a0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1e1b0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1e1c0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1e1d0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1e1e0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1e1f0 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1e200 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1e210 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1e220 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1e230 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1e240 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1e250 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1e260 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1e270 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1e280 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1e290 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1e2a0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1e2b0 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1e2c0 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1e2d0 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1e2e0 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1e2f0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1e300 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1e310 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1e320 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1e330 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1e340 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1e350 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1e360 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1e370 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e380 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1e390 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1e3a0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1e3b0 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1e3c0 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1e3d0 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1e3e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1e3f0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1e400 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1e410 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e420 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1e430 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1e440 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1e450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1e460 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1e470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1e480 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1e490 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1e4a0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1e4b0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1e4c0 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1e4d0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1e4e0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1e4f0 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1e500 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1e510 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1e520 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1e530 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e540 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1e550 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e560 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e570 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e580 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e590 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e5a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e5b0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e5c0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e5d0 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e5e0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e5f0 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e600 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e610 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e620 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e630 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e640 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e650 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e660 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e670 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e680 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e690 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e6a0 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e6b0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e6c0 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e6d0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e6e0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e6f0 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e700 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e710 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e720 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e730 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e740 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e750 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e760 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e770 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e780 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e790 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e7a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e7b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e7c0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e7d0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e7e0 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e7f0 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e800 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e810 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e820 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e830 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e840 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e850 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e860 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e870 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e880 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e890 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e8a0 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e8b0 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e8c0 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e8d0 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e8e0 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e8f0 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e900 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e910 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e920 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e930 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e940 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e950 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e960 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e970 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e980 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e990 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e9a0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e9b0 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e9c0 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e9d0 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e9e0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e9f0 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1ea00 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1ea10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ea20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ea30 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1ea40 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1ea50 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1ea60 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1ea70 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1ea80 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1ea90 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1eac0 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1ead0 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1eae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1eaf0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1eb00 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1eb10 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1eb20 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1eb30 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1eb40 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1eb50 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1eb60 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1eb70 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1eb80 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1eb90 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1eba0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1ebb0 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1ebc0 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1ebd0 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1ebe0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1ebf0 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1ec00 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1ec10 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1ec20 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1ec30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1ec40 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1ec50 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1ec60 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1ec70 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1ec80 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1ec90 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1eca0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1ecb0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1ecc0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1ecd0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1ece0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1ecf0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1ed00 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1ed10 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1ed20 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1ed30 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1ed40 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1ed50 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1ed60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1ed70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1ed80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1ed90 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1eda0 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1edb0 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1edc0 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1edd0 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1ede0 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1edf0 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1ee00 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1ee10 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1ee20 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1ee30 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1ee40 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1ee50 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1ee60 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1ee70 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1ee80 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1ee90 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1eea0 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1eeb0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1eec0 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1eed0 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1eee0 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1eef0 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1ef00 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1ef10 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1ef20 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1ef30 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1ef40 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1ef50 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1ef60 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef80 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1ef90 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1efa0 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1efb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1efc0 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1efd0 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1efe0 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1f010 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1f020 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f050 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1f060 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1f070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f080 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f090 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1f0a0 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f0c0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1f0d0 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1f0e0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1f0f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1f100 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1f110 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1f120 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1f130 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1f140 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1f150 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1f160 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1f170 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f180 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1f190 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1f1a0 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1f1b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1f1c0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1f1d0 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1f1e0 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1f1f0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1f200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1f210 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1f220 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1f230 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1f240 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1f250 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1f260 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1f270 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1f280 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1f290 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1f2a0 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1f2b0 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1f2c0 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1f2d0 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1f2e0 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1f2f0 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1f300 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1f310 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1f320 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1f330 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1f340 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f350 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1f360 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1f370 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1f380 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1f390 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1f3a0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1f3b0 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1f3c0 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1f3d0 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1f3e0 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1f3f0 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1f400 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1f410 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1f420 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1f430 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1f440 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1f450 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1f460 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1f470 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1f480 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1f490 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1f4a0 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1f4b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f4c0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f4d0 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1f4e0 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f4f0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f500 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1f510 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1f520 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1f530 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1f540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1f550 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f560 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f570 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f580 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f590 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f5a0 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f5b0 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f5c0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f5d0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f5e0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f5f0 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f600 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f610 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f620 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f630 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f640 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f650 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f660 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f670 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f680 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f690 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f6a0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f6b0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f6c0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f6d0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f6e0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f6f0 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f700 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f710 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f720 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1f730 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1f740 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f750 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1f760 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f790 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1f7a0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1f7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f7c0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f7d0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f7e0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f7f0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f810 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f820 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f830 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f840 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f850 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f860 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f870 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f880 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f890 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f8a0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f8b0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f8c0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f8d0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f8e0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f8f0 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f900 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f910 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f920 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f930 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f940 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f950 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f960 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f970 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f980 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f990 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f9a0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f9b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f9c0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f9d0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f9e0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f9f0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1fa00 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1fa10 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1fa20 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1fa30 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1fa40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1fa50 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1fa60 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1fa70 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1fa80 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1fa90 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1faa0 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1fab0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1fac0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1fad0 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1fae0 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1faf0 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1fb00 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1fb10 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1fb20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1fb30 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fb40 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1fb50 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1fb60 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1fb70 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1fb80 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1fb90 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1fba0 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1fbb0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1fbc0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1fbd0 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1fbe0 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1fbf0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1fc00 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1fc10 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1fc20 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1fc30 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1fc40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1fc50 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1fc60 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1fc70 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1fc80 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1fc90 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1fca0 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1fcb0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1fcc0 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1fcd0 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1fce0 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1fcf0 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1fd00 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1fd10 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1fd20 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1fd30 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1fd40 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1fd50 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1fd60 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1fd70 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1fd80 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1fd90 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1fda0 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1fdb0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1fdc0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1fdd0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1fde0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fdf0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1fe00 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1fe10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1fe20 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
1fe30 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1fe40 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65 20  e==0 );.  nPage 
1fe50 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69  = sqlite3WalDbsi
1fe60 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  ze(pPager->pWal)
1fe70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  ;..  /* If the n
1fe80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fe90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1fea0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1feb0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41  from the.  ** WA
1fec0 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65  L sub-system, de
1fed0 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65  termine the page
1fee0 20 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e   counte based on
1fef0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
1ff00 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1ff10 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
1ff20 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ff30 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
1ff40 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
1ff50 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
1ff60 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
1ff70 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
1ff80 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
1ff90 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
1ffa0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
1ffb0 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
1ffc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ffd0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ffe0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
1fff0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
20000 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
20010 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
20020 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
20030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20050 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20060 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20070 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20080 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20090 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
200a0 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
200b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
200c0 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
200d0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
200e0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
200f0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
20100 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20110 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20120 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20130 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20140 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20150 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20160 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20170 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20180 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20190 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
201a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
201b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
201c0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
201d0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
201e0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
201f0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20200 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20210 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20220 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20230 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20240 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20250 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20260 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20270 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20280 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20290 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
202a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
202b0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
202c0 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
202d0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
202e0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
202f0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20300 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20310 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20320 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20330 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20340 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20350 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20360 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20370 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20380 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20390 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
203a0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
203b0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
203c0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
203d0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
203e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
203f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20400 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20410 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20420 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20430 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20440 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20450 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20460 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20470 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20480 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20490 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
204a0 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
204b0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
204c0 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
204d0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
204e0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
204f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20500 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20510 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20520 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20530 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20540 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20550 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20560 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20570 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20580 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20590 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
205a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
205b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
205c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
205d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
205e0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
205f0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   */.    Pgno nPa
20600 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
20610 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
20620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20630 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20  le */..    rc = 
20640 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
20650 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
20660 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20670 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
20680 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
20690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
206a0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
206b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  Vfs, pPager->zWa
206c0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  l, 0);.      if(
206d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
206e0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29  R_DELETE_NOENT )
206f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20700 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30  .      isWal = 0
20710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20730 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
20740 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c     pPager->pVfs,
20750 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53   pPager->zWal, S
20760 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20770 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20  STS, &isWal.    
20780 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
20790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
207a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
207b0 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Wal ){.        t
207c0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
207d0 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
207e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
207f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
20800 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20810 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
20820 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
20830 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
20840 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
20850 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29  OURNALMODE_WAL )
20860 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20870 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20880 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20890 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20  E_DELETE;.      
208a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
208b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
208c0 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  f../*.** Playbac
208d0 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76  k savepoint pSav
208e0 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70  epoint. Or, if p
208f0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c  Savepoint==NULL,
20900 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a   then playback.*
20910 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  * the entire mas
20920 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20930 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65  . The case pSave
20940 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75  point==NULL occu
20950 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f  rs when .** a RO
20960 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e  LLBACK TO comman
20970 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20  d is invoked on 
20980 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
20990 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
209a0 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e  n .** savepoint.
209b0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76  .**.** When pSav
209c0 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55  epoint is not NU
209d0 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f  LL (meaning a no
209e0 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  n-transaction sa
209f0 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62  vepoint is .** b
20a00 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
20a10 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  ), then the roll
20a20 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66  back consists of
20a30 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61   up to three sta
20a40 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65  ges,.** performe
20a50 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73  d in the order s
20a60 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20  pecified:.**.** 
20a70 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c    * Pages are pl
20a80 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
20a90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20aa0 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65  starting at byte
20ab0 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50  .**     offset P
20ac0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20ad0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20ae0 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20  uing to .**     
20af0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20b00 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f  HdrOffset, or to
20b10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20b20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  main journal.** 
20b30 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65      file if Page
20b40 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20b50 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a  ffset is zero..*
20b60 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65  *.**   * If Page
20b70 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
20b80 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72  ffset is not zer
20b90 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  o, then pages ar
20ba0 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20  e played.**     
20bb0 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72  back starting fr
20bc0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
20bd0 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c  eader immediatel
20be0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20  y following .** 
20bf0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
20c00 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f  nt.iHdrOffset to
20c10 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
20c20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
20c30 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67  e..**.**   * Pag
20c40 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79  es are then play
20c50 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
20c60 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
20c70 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20  e, starting.**  
20c80 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65     with the Page
20c90 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52  rSavepoint.iSubR
20ca0 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  ec and continuin
20cb0 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a  g to the end of.
20cc0 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
20cd0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  al file..**.** T
20ce0 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f  hroughout the ro
20cf0 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20  llback process, 
20d00 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65  each time a page
20d10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
20d20 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f   the.** correspo
20d30 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74  nding bit is set
20d40 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72   in a bitvec str
20d50 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65  ucture (variable
20d60 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a   pDone in the.**
20d70 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
20d80 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20  below). This is 
20d90 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
20da0 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e  hat a page is on
20db0 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ly.** rolled bac
20dc0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
20dd0 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   it is encounter
20de0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75  ed in either jou
20df0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  rnal..**.** If p
20e00 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c  Savepoint is NUL
20e10 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72  L, then pages ar
20e20 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61  e only played ba
20e30 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
20e40 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
20e50 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
20e60 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20  ed for a bitvec 
20e70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
20e80 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61  .** In either ca
20e90 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62  se, before playb
20ea0 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68  ack commences th
20eb0 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76  e Pager.dbSize v
20ec0 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65  ariable.** is re
20ed0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
20ee0 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74   that it held at
20ef0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
20f00 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  e savepoint .** 
20f10 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  (or transaction)
20f20 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61  . No page with a
20f30 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65   page-number gre
20f40 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  ater than this v
20f50 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65  alue.** is playe
20f60 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69  d back. If one i
20f70 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74  s encountered it
20f80 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70   is simply skipp
20f90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20fa0 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
20fb0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
20fc0 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
20fd0 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
20fe0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
20ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21000 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
21010 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
21020 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
21030 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
21040 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
21050 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
21060 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
21070 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rds */.  int rc 
21080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21090 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
210a0 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
210b0 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
210c0 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
210d0 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
210e0 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
210f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
21100 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
21110 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
21120 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
21130 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
21140 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20  ER_LOCKED );..  
21150 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
21160 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
21170 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
21180 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
21190 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
211a0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
211b0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
211c0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
211d0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
211e0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
211f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21200 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
21210 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
21220 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
21230 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
21240 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
21250 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
21260 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
21270 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
21280 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
21290 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
212a0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
212b0 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
212c0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
212d0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
212e0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
212f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
21300 20 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e    if( !pSavepoin
21310 74 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  t && pagerUseWal
21320 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21330 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c  return pagerRoll
21340 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b  backWal(pPager);
21350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70  .  }..  /* Use p
21360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21370 66 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69  f as the effecti
21380 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
21390 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
213a0 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  * journal.  The 
213b0 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68  actual file migh
213c0 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  t be larger than
213d0 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41   this in.  ** PA
213e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
213f0 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45  TRUNCATE or PAGE
21400 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
21410 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74  RSIST.  But anyt
21420 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70  hing.  ** past p
21430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21440 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20  f is off-limits 
21450 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a  to us..  */.  sz
21460 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
21470 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  nalOff;.  assert
21480 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
21490 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d  ager)==0 || szJ=
214a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
214b0 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63  n by rolling bac
214c0 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  k records from t
214d0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
214e0 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
214f0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21500 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
21510 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inuing to the ne
21520 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
21530 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69  r..  ** There mi
21540 67 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69  ght be records i
21550 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
21560 61 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70  al that have a p
21570 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
21580 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
21590 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
215a0 65 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e  e size (pPager->
215b0 64 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73  dbSize) but thos
215c0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  e.  ** will be s
215d0 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63  kipped automatic
215e0 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65  ally.  Pages are
215f0 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20   added to pDone 
21600 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65  as they.  ** are
21610 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
21620 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21630 69 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65  int && !pagerUse
21640 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
21650 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61     iHdrOff = pSa
21660 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
21670 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  set ? pSavepoint
21680 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73  ->iHdrOffset : s
21690 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  zJ;.    pPager->
216a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61  journalOff = pSa
216b0 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74  vepoint->iOffset
216c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
216d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
216e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
216f0 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  <iHdrOff ){.    
21700 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
21710 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
21720 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
21730 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
21740 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
21750 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21760 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
21780 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
21790 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
217a0 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
217b0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
217c0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
217d0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
217e0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
217f0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
21800 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
21810 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
21820 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
21830 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21840 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
21850 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
21860 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
21870 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
21880 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
21890 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
218a0 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
218b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
218c0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
218d0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
218e0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
218f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
21900 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
21910 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
21920 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
21930 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
21940 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
21950 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
21960 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
21970 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
21980 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
21990 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
219a0 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
219b0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
219c0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
219d0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
219e0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
219f0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
21a00 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
21a10 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
21a20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
21a30 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
21a40 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21a50 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
21a60 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
21a70 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
21a80 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
21a90 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
21aa0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
21ab0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
21ac0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
21ad0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
21ae0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
21af0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
21b00 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
21b10 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
21b20 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
21b30 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
21b40 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
21b50 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
21b60 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
21b70 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
21b80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
21b90 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
21ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21bb0 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
21bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21bd0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21be0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
21bf0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21c00 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
21c10 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b  urnalOff>=szJ );
21c20 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
21c30 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
21c40 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
21c50 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
21c60 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
21c70 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
21c80 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
21c90 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
21ca0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
21cb0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
21cc0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
21cd0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
21ce0 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
21cf0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
21d00 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
21d10 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
21d20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
21d30 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
21d40 20 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69   = (i64)pSavepoi
21d50 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
21d60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
21d70 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
21d80 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
21d90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
21da0 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74  ite3WalSavepoint
21db0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
21dc0 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61  l, pSavepoint->a
21dd0 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  WalData);.    }.
21de0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
21df0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
21e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21e10 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
21e20 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
21e30 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
21e40 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61  ==(i64)ii*(4+pPa
21e50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
21e60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
21e70 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21e80 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66  page(pPager, &of
21e90 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20  fset, pDone, 0, 
21ea0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21eb0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21ec0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
21ed0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21ee0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
21ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21f00 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21f10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
21f20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
21f40 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21f50 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21f60 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21f70 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21f80 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21f90 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e  to recycle clean
21fa0 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65   and unused page
21fb0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
21fc0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
21fd0 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
21fe0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
21ff0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
22000 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67  etCachesize(pPag
22010 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22020 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  age);.}../*.** C
22030 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22040 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22050 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22060 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22070 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22080 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73  g to spill pages
22090 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a   to journal..*/.
220a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
220b0 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67  SetSpillsize(Pag
220c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
220d0 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  mxPage){.  retur
220e0 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  n sqlite3PcacheS
220f0 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67  etSpillsize(pPag
22100 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50  er->pPCache, mxP
22110 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  age);.}../*.** I
22120 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e  nvoke SQLITE_FCN
22130 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73  TL_MMAP_SIZE bas
22140 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ed on the curren
22150 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61  t value of szMma
22160 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
22170 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d  d pagerFixMaplim
22180 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22190 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
221a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
221b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
221c0 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20   = pPager->fd;. 
221d0 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20   if( isOpen(fd) 
221e0 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  && fd->pMethods-
221f0 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a  >iVersion>=3 ){.
22200 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
22210 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70  4 sz;.    sz = p
22220 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20  Pager->szMmap;. 
22230 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46     pPager->bUseF
22240 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20  etch = (sz>0);. 
22250 20 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68     setGetterMeth
22260 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  od(pPager);.    
22270 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
22280 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
22290 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
222a0 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a  L_MMAP_SIZE, &sz
222b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
222c0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
222d0 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
222e0 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70  f any memory map
222f0 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65  ping made of the
22300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
22310 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22320 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
22330 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22340 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
22350 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d  Mmap){.  pPager-
22360 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  >szMmap = szMmap
22370 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c  ;.  pagerFixMapl
22380 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a  imit(pPager);.}.
22390 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d  ./*.** Free as m
223a0 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
223b0 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ssible from the 
223c0 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pager..*/.void s
223d0 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
223e0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
223f0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
22400 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e  eShrink(pPager->
22410 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
22420 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e  ** Adjust settin
22430 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  gs of the pager 
22440 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
22450 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67  ed in the pgFlag
22460 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  s parameter..**.
22470 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69  ** The "level" i
22480 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  n pgFlags & PAGE
22490 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
224a0 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62 75  SK sets the robu
224b0 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65  stness.** of the
224c0 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
224d0 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
224e0 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66  ashes or power f
224f0 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68  ailures by.** ch
22500 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
22510 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
22520 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a  en writing the j
22530 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72  ournals..** Ther
22540 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76 65 6c  e are four level
22550 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
22560 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
22570 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
22580 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
22590 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
225a0 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
225b0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
225c0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
225d0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
225e0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
225f0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
22600 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
22610 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
22620 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
22630 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
22640 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
22650 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
22670 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
22680 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
22690 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
226a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
226b0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
226c0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
226d0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
226e0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
226f0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
22700 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
22710 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
22720 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
22740 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
22750 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
22760 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
22770 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
22780 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
22790 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
227a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
227b0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
227c0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
227d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
227e0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
227f0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
22800 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
22810 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
22820 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
22830 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
22840 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
22850 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
22860 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
22870 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
22880 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
22890 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
228a0 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
228b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
228c0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
228d0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
228e0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
228f0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
22900 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
22910 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
22920 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
22930 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
22940 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52 41 20  .**.**    EXTRA 
22950 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
22960 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74 68 61   FULL except tha
22970 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63 73 20  t is also syncs 
22980 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
229a0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
229b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
229c0 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c 6c 62   after the rollb
229d0 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ack.**          
229e0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75      journal is u
229f0 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  nlinked..**.** T
22a00 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20  he above is for 
22a10 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  a rollback-journ
22a20 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41  al mode.  For WA
22a30 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74  L mode, OFF cont
22a40 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e  inues.** to mean
22a50 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65   that no syncs e
22a60 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d  ver occur.  NORM
22a70 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  AL means that th
22a80 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a  e WAL is synced.
22a90 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ** prior to the 
22aa0 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f  start of checkpo
22ab0 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74 68 65  int and that the
22ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22ad0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74  s synced.** at t
22ae0 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
22af0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
22b00 69 66 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  if the entire co
22b10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c  ntent of the WAL
22b20 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20  .** was written 
22b30 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
22b40 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20  tabase.  But no 
22b50 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20  sync operations 
22b60 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20  occur for.** an 
22b70 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20  ordinary commit 
22b80 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77  in NORMAL mode w
22b90 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d  ith WAL.  FULL m
22ba0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57 41  eans that the WA
22bb0 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e  L.** file is syn
22bc0 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ced following ea
22bd0 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74  ch commit operat
22be0 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e  ion, in addition
22bf0 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73   to the.** syncs
22c00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22c10 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72 65 20   NORMAL.  There 
22c20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65  is no difference
22c30 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a   between FULL.**
22c40 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72 20 57   and EXTRA for W
22c50 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44  AL mode..**.** D
22c60 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79  o not confuse sy
22c70 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77  nchronous=FULL w
22c80 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ith SQLITE_SYNC_
22c90 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51  FULL.  The.** SQ
22ca0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d  LITE_SYNC_FULL m
22cb0 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73  acro means to us
22cc0 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79  e the MacOSX-sty
22cd0 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a  le full-fsync.**
22ce0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46   using fcntl(F_F
22cf0 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49  ULLFSYNC).  SQLI
22d00 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d  TE_SYNC_NORMAL m
22d10 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a  eans to do an.**
22d20 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28   ordinary fsync(
22d30 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69  ) call.  There i
22d40 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
22d50 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53  between SQLITE_S
22d60 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20  YNC_FULL.** and 
22d70 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22d80 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20  AL on platforms 
22d90 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53  other than MacOS
22da0 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73  X.  But the.** s
22db0 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
22dc0 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f  versus synchrono
22dd0 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e  us=NORMAL settin
22de0 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  g determines whe
22df0 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70  n.** the xSync p
22e00 72 69 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c  rimitive is call
22e10 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61  ed and is releva
22e20 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f  nt to all platfo
22e30 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  rms..**.** Numer
22e40 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
22e50 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
22e60 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
22e70 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
22e80 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
22e90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22ea0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
22eb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
22ec0 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20 50 61  erSetFlags(.  Pa
22ed0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22ee0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
22ef0 20 74 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c   to set safety l
22f00 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e  evel for */.  un
22f10 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20  signed pgFlags  
22f20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66      /* Various f
22f30 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  lags */.){.  uns
22f40 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20 70 67  igned level = pg
22f50 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53 59  Flags & PAGER_SY
22f60 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a  NCHRONOUS_MASK;.
22f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
22f80 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50  mpFile ){.    pP
22f90 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31  ager->noSync = 1
22fa0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
22fb0 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  llSync = 0;.    
22fc0 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
22fd0 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
22fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79      pPager->noSy
22ff0 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47  nc =  level==PAG
23000 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f  ER_SYNCHRONOUS_O
23010 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61  FF ?1:0;.    pPa
23020 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
23030 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e  level>=PAGER_SYN
23040 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31  CHRONOUS_FULL ?1
23050 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  :0;.    pPager->
23060 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65 76 65  extraSync = leve
23070 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f  l==PAGER_SYNCHRO
23080 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b  NOUS_EXTRA ?1:0;
23090 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
230a0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
230b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
230c0 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  gs = 0;.    pPag
230d0 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
230e0 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  s = 0;.  }else i
230f0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
23100 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a  ER_FULLFSYNC ){.
23110 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
23120 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
23130 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50  YNC_FULL;.    pP
23140 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
23150 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23160 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20  C_FULL;.  }else 
23170 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
23180 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59  GER_CKPT_FULLFSY
23190 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  NC ){.    pPager
231a0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
231b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
231c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
231d0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
231e0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
231f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
23200 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
23210 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23220 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
23230 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23240 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
23250 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MAL;.  }.  pPage
23260 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
23270 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
23280 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ags;.  if( pPage
23290 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
232a0 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79     pPager->walSy
232b0 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53  ncFlags |= WAL_S
232c0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
232d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 46 6c  ;.  }.  if( pgFl
232e0 61 67 73 20 26 20 50 41 47 45 52 5f 43 41 43 48  ags & PAGER_CACH
232f0 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50  ESPILL ){.    pP
23300 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
23310 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f   &= ~SPILLFLAG_O
23320 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  FF;.  }else{.   
23330 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
23340 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
23350 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  _OFF;.  }.}.#end
23360 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
23370 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
23380 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
23390 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
233a0 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
233b0 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
233c0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
233d0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
233e0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
233f0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
23400 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
23410 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
23420 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
23430 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
23440 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
23450 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
23460 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
23470 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
23480 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
23490 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
234a0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
234b0 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
234c0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
234d0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
234e0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
234f0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
23500 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
23510 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
23520 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
23530 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
23540 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
23550 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
23560 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
23570 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
23580 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
23590 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
235a0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
235b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
235c0 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
235d0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
235e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
235f0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
23600 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
23610 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
23620 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
23630 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
23640 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
23650 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
23660 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
23670 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
23680 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
23690 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
236a0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
236b0 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
236c0 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
236d0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
236e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23700 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
23710 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23720 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
23730 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
23740 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
23750 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23760 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
23770 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
23780 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
23790 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
237a0 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
237b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
237c0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
237d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
237e0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
237f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
23800 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
23810 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
23820 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
23830 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
23840 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
23850 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23860 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
23870 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
23880 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
23890 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
238a0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
238b0 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
238c0 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
238d0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
238e0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
238f0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
23900 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
23910 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
23920 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
23930 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
23940 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
23950 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
23960 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
23970 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
23980 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
23990 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
239a0 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
239b0 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
239c0 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
239d0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
239e0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
239f0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
23a00 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
23a10 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
23a20 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
23a30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
23a40 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
23a50 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
23a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a90 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
23aa0 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
23ab0 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
23ac0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
23ad0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
23ae0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
23af0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
23b00 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
23b10 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
23b20 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
23b30 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
23b40 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
23b50 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
23b60 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
23b70 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
23b80 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
23b90 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
23ba0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
23bb0 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
23bc0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
23bd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
23be0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
23bf0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
23c00 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
23c10 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
23c20 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
23c50 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
23c60 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
23c70 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
23c80 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
23c90 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
23ca0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
23cb0 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
23cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
23cd0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
23ce0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
23cf0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
23d00 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
23d10 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
23d20 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
23d30 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
23d40 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
23d50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
23d60 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
23d70 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
23d80 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
23d90 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
23da0 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
23db0 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
23dc0 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
23dd0 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
23de0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
23e00 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
23e10 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
23e20 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
23e30 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
23e40 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
23e50 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
23e60 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
23e70 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
23e80 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
23e90 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
23ea0 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
23eb0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
23ec0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
23ed0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
23ee0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
23ef0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
23f00 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
23f10 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
23f20 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
23f30 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
23f40 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
23f50 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
23f60 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
23f70 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
23f80 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
23f90 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
23fa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
23fb0 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
23fc0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
23fd0 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
23fe0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
23ff0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
24000 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
24010 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
24020 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
24030 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
24040 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
24050 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
24060 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
24070 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
24080 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
24090 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
240a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
240b0 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
240c0 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
240d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
240e0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
240f0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
24100 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
24110 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
24120 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
24130 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
24140 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24150 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
24160 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
24170 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
24180 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
24190 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
241a0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
241b0 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
241c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
241d0 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
241e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
241f0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
24200 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
24210 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
24220 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
24230 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
24240 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
24250 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
24260 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
24270 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
24280 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
24290 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
242a0 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
242b0 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
242c0 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
242d0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
242e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
242f0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
24300 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
24310 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
24320 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
24330 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
24340 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
24350 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
24360 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
24370 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
24380 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
24390 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
243a0 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
243b0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
243c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
243d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
243e0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
243f0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
24400 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
24410 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
24420 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
24430 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
24440 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
24450 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
24460 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
24470 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
24480 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
24490 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
244a0 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
244b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
244c0 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
244d0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
244e0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
244f0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
24500 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
24510 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
24520 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
24530 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
24540 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
24550 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
24560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
24570 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
24580 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
24590 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
245a0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
245b0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
245c0 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
245d0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
245e0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
245f0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24600 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
24610 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
24620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
24630 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
24640 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
24650 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24660 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
24670 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
24680 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
24690 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
246a0 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
246b0 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
246c0 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
246d0 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
246e0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
246f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
24700 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
24710 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
24720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
24730 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
24740 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
24750 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
24760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24770 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
24780 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
24790 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
247a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
247b0 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
247c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
247d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
247e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
247f0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
24800 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
24810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
24820 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
24830 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
24840 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
24850 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
24860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24870 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
24880 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
24890 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ce);.      pPage
248a0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
248b0 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65  New;.      pPage
248c0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e  r->dbSize = (Pgn
248d0 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69  o)((nByte+pageSi
248e0 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b  ze-1)/pageSize);
248f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
24900 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
24910 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ze;.    }else{. 
24920 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
24930 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
24940 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
24950 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
24960 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
24970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24980 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
24990 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
249a0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
249b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
249c0 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
249d0 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
249e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
249f0 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
24a00 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
24a10 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
24a20 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c      pagerFixMapl
24a30 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  imit(pPager);.  
24a40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24a50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
24a60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
24a70 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
24a80 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
24a90 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
24aa0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
24ab0 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
24ac0 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
24ad0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
24ae0 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
24af0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
24b00 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
24b10 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
24b20 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
24b30 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
24b40 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
24b50 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
24b60 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
24b70 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
24b80 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
24b90 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
24ba0 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
24bb0 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
24bc0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
24bd0 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
24be0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24bf0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
24c00 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
24c10 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
24c20 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
24c30 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
24c40 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
24c50 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
24c60 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
24c70 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
24c80 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
24c90 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
24ca0 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
24cb0 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
24cc0 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
24cd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
24ce0 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
24cf0 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
24d00 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
24d10 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
24d20 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
24d30 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
24d40 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24d50 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
24d60 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
24d70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
24d80 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
24d90 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
24da0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24db0 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f  R_OPEN );      /
24dc0 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79  * Called only by
24dd0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a   OP_MaxPgcnt */.
24de0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24df0 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72  ->mxPgno>=pPager
24e00 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20  ->dbSize );  /* 
24e10 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f  OP_MaxPgcnt enfo
24e20 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72  rces this */.  r
24e30 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
24e40 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
24e50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
24e60 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
24e70 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
24e80 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
24e90 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
24ea0 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
24eb0 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
24ec0 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
24ed0 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
24ee0 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
24ef0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
24f00 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
24f10 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
24f20 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
24f30 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
24f40 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
24f50 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
24f60 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
24f70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
24f80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
24f90 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24fa0 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
24fb0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
24fc0 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
24fd0 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
24fe0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24ff0 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
25000 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
25010 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
25020 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
25030 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
25040 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
25050 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
25060 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25070 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
25080 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
25090 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
250a0 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
250b0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
250c0 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
250d0 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
250e0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
250f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
25100 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
25110 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
25120 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
25130 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
25140 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
25150 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
25160 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  If the pager was
25170 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61   opened on a tra
25180 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69  nsient file (zFi
25190 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a  lename==""), or.
251a0 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66  ** opened on a f
251b0 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20  ile less than N 
251c0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
251d0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
251e0 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e   is.** zeroed an
251f0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
25200 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e  rned. The ration
25210 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20  ale for this is 
25220 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75  that this .** fu
25230 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
25240 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20  o read database 
25250 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e  headers, and a n
25260 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a  ew transient or.
25270 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61  ** zero sized da
25280 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61  tabase has a hea
25290 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74  der than consist
252a0 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65  s entirely of ze
252b0 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  roes..**.** If a
252c0 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72  ny IO error apar
252d0 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f  t from SQLITE_IO
252e0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69  ERR_SHORT_READ i
252f0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a  s encountered,.*
25300 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  * the error code
25310 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
25320 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74  the caller and t
25330 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25340 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66  he.** output buf
25350 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  fer undefined..*
25360 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
25370 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
25380 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25390 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
253a0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
253b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
253c0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
253d0 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
253e0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
253f0 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
25400 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
25410 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
25420 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
25430 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69   by btree immedi
25440 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61  ately after crea
25450 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61  ting.  ** the Pa
25460 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  ger object.  The
25470 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  re has not been 
25480 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
25490 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a  o transition.  *
254a0 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65  * to WAL mode ye
254b0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
254c0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
254d0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
254e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
254f0 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  fd) ){.    IOTRA
25500 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
25510 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
25520 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
25530 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
25540 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
25550 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
25560 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
25570 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
25580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
255a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
255b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
255c0 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
255d0 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72  d when a read-tr
255e0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
255f0 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  n on.** the page
25600 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68  r. It returns th
25610 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
25620 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
25630 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48  atabase..**.** H
25640 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66  owever, if the f
25650 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31  ile is between 1
25660 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e   and <page-size>
25670 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
25680 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73  then .** this is
25690 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20   considered a 1 
256a0 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f  page file..*/.vo
256b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  id sqlite3PagerP
256c0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
256d0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
256e0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
256f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
25700 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
25710 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25720 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
25730 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
25740 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28  );.  *pnPage = (
25750 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69  int)pPager->dbSi
25760 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72  ze;.}.../*.** Tr
25770 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
25780 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74  ck of type lockt
25790 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ype on the datab
257a0 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20  ase file. If.** 
257b0 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65  a similar or gre
257c0 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ater lock is alr
257d0 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20  eady held, this 
257e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
257f0 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e  -op.** (returnin
25800 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65  g SQLITE_OK imme
25810 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  diately)..**.** 
25820 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d  Otherwise, attem
25830 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  pt to obtain the
25840 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69   lock using sqli
25850 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76  te3OsLock(). Inv
25860 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79  oke .** the busy
25870 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
25880 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74   lock is current
25890 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
258a0 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74  . Repeat .** unt
258b0 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
258c0 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c  back returns fal
258d0 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20  se or until the 
258e0 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f  attempt to .** o
258f0 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73  btain the lock s
25900 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
25910 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
25920 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
25930 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
25940 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
25950 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66  .** the lock. If
25960 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
25970 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c  ained successful
25980 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ly, set the Page
25990 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69  r.state .** vari
259a0 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65  able to locktype
259b0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
259c0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
259d0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
259e0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
259f0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
25a00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
25a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
25a30 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
25a40 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73   Check that this
25a50 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d   is either a no-
25a60 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20  op (because the 
25a70 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69  requested lock i
25a80 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  s .  ** already 
25a90 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66  held), or one of
25aa0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73   the transitions
25ab0 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68   that the busy-h
25ac0 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20  andler.  ** may 
25ad0 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e  be invoked durin
25ae0 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  g, according to 
25af0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
25b00 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
25b10 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
25b20 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  r()..  */.  asse
25b30 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f  rt( (pPager->eLo
25b40 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20  ck>=locktype).  
25b50 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
25b60 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
25b70 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
25b80 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
25b90 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
25ba0 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
25bb0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45  K && locktype==E
25bc0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
25bd0 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
25be0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
25bf0 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70  (pPager, locktyp
25c00 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  e);.  }while( rc
25c10 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
25c20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
25c30 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
25c40 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29  usyHandlerArg) )
25c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
25c60 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
25c70 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25c80 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
25c90 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e  ) checks that on
25ca0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
25cb0 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66  lowing is true f
25cc0 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  or all dirty pag
25cd0 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  es currently in 
25ce0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a  the page-cache:.
25cf0 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70  **.**   a) The p
25d00 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65  age number is le
25d10 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
25d20 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
25d30 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72  the .**      cur
25d40 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d  rent database im
25d50 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f  age, in pages, O
25d60 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20  R.**.**   b) if 
25d70 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
25d80 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74   were written at
25d90 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77   this time, it w
25da0 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  ould not.**     
25db0 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
25dc0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25dd0 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74  nt content out t
25de0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
25df0 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65  l.**      (as de
25e00 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63  termined by func
25e10 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65  tion subjRequire
25e20 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  sPage())..**.** 
25e30 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  If the condition
25e40 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69   asserted by thi
25e50 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20  s function were 
25e60 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68  not true, and th
25e70 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
25e80 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61  were to be disca
25e90 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  rded from the ca
25ea0 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65  che via the page
25eb0 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75  rStress().** rou
25ec0 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73  tine, pagerStres
25ed0 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72  s() would not wr
25ee0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
25ef0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a  page content to.
25f00 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
25f10 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70  file. If a savep
25f20 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  oint transaction
25f30 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63   were rolled bac
25f40 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20  k after.** this 
25f50 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f  happened, the co
25f60 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77  rrect behavior w
25f70 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f  ould be to resto
25f80 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  re the current.*
25f90 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
25fa0 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20   page. However, 
25fb0 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65  since this conte
25fc0 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
25fd0 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74  t in either.** t
25fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
25ff0 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20   or the portion 
26000 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
26010 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20  journal and .** 
26020 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  sub-journal roll
26030 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74  ed back the cont
26040 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ent could not be
26050 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68   restored and th
26060 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d  e.** database im
26070 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65  age would become
26080 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20   corrupt. It is 
26090 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e  therefore fortun
260a0 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69  ate that .** thi
260b0 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63  s circumstance c
260c0 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a  annot arise..*/.
260d0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
260e0 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63  TE_DEBUG).static
260f0 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
26100 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62  cateConstraintCb
26110 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26120 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
26130 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
26140 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62  ;.  assert( !sub
26150 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
26160 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c  g) || pPg->pgno<
26170 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  =pPg->pPager->db
26180 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63  Size );.}.static
26190 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e   void assertTrun
261a0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50  cateConstraint(P
261b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
261c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
261d0 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
261e0 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65  r->pPCache, asse
261f0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26200 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65  aintCb);.}.#else
26210 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  .# define assert
26220 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26230 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69  nt(pPager).#endi
26240 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  f../*.** Truncat
26250 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
26260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d  database file im
26270 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67  age to nPage pag
26280 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  es. This .** fun
26290 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61  ction does not a
262a0 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74  ctually modify t
262b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
262c0 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a   on disk. It .**
262d0 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69   just sets the i
262e0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66  nternal state of
262f0 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
26300 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a  t so that the .*
26310 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c  * truncation wil
26320 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74  l be done when t
26330 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
26340 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
26350 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
26360 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
26370 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26380 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26390 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
263a0 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63  * Once this func
263b0 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61  tion has been ca
263c0 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61  lled, the transa
263d0 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65  ction must eithe
263e0 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  r be.** rolled b
263f0 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64  ack or committed
26400 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65  . It is not safe
26410 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75   to call this fu
26420 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68  nction and.** th
26430 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74  en continue writ
26440 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
26450 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ase..*/.void sql
26460 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
26470 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50  eImage(Pager *pP
26480 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
26490 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
264a0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
264b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
264c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
264d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
264e0 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65  HEMOD );.  pPage
264f0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
26500 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  e;..  /* At one 
26510 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68  point the code h
26520 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72  ere called asser
26530 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26540 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e  int() to.  ** en
26550 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61  sure that all pa
26560 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61  ges being trunca
26570 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73  ted away by this
26580 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a   operation are,.
26590 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d    ** if one or m
265a0 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ore savepoints a
265b0 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74  re open, present
265c0 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e   in the savepoin
265d0 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  t .  ** journal 
265e0 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e  so that they can
265f0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20   be restored if 
26600 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
26610 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63   rolled.  ** bac
26620 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f  k. This is no lo
26630 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61  nger necessary a
26640 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
26650 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a  is now only.  **
26660 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65   called right be
26670 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20  fore committing 
26680 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  a transaction. S
26690 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a  o although the .
266a0 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    ** Pager objec
266b0 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65  t may still have
266c0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
266d0 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69   (Pager.nSavepoi
266e0 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68  nt!=0), .  ** th
266f0 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  ey cannot be rol
26700 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65  led back. So the
26710 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
26720 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c  onstraint() call
26730 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  .  ** is no long
26740 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d  er correct. */.}
26750 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
26760 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26770 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26780 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ng a hot-journal
26790 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a   rollback. It.**
267a0 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e   syncs the journ
267b0 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c  al file to disk,
267c0 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65   then sets pPage
267d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f  r->journalHdr to
267e0 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20   the.** size of 
267f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26800 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
26810 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
26820 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74  utine knows.** t
26830 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a  hat the entire j
26840 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
26850 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  been synced..**.
26860 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74  ** Syncing a hot
26870 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b  -journal to disk
26880 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
26890 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  ng to roll it ba
268a0 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74  ck ensures .** t
268b0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66  hat if a power-f
268c0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75  ailure occurs du
268d0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
268e0 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  k, the process t
268f0 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  hat.** attempts 
26900 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
26910 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65  ng system recove
26920 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65  ry sees the same
26930 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74   journal.** cont
26940 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63  ent as this proc
26950 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76  ess..**.** If ev
26960 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73  erything goes as
26970 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45   planned, SQLITE
26980 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
26990 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
269a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
269b0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
269c0 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74  int pagerSyncHot
269d0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
269e0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
269f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26a00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
26a10 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
26a20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
26a30 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
26a40 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
26a50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
26a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
26a80 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
26a90 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  d, &pPager->jour
26aa0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72  nalHdr);.  }.  r
26ab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
26ac0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
26ad0 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62  _SIZE>0./*.** Ob
26ae0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
26af0 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70   to a memory map
26b00 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20  ped page object 
26b10 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
26b20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65  pgno. .** The ne
26b30 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75 73  w object will us
26b40 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 44  e the pointer pD
26b50 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66 72  ata, obtained fr
26b60 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20  om xFetch()..** 
26b70 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
26b80 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70 6f  et *ppPage to po
26b90 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
26ba0 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a  age reference.**
26bb0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
26bc0 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65  TE_OK. Otherwise
26bd0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
26be0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  te error code an
26bf0 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65  d set.** *ppPage
26c00 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   to zero..**.** 
26c10 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  Page references 
26c20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c 6c  obtained by call
26c30 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
26c40 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c 65  n should be rele
26c50 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69  ased.** by calli
26c60 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  ng pagerReleaseM
26c70 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  apPage()..*/.sta
26c80 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71  tic int pagerAcq
26c90 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20 50  uireMapPage(.  P
26ca0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cc0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
26cd0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cf0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
26d00 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44  er */.  void *pD
26d10 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
26d20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63          /* xFetc
26d30 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20 74  h()'d data for t
26d40 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  his page */.  Pg
26d50 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20 20  Hdr **ppPage    
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d70 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20 70   OUT: Acquired p
26d80 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  age object */.){
26d90 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20  .  PgHdr *p;    
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
26dc0 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74 75  ped page to retu
26dd0 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70  rn */.  .  if( p
26de0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26df0 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70 50  list ){.    *ppP
26e00 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65 72  age = p = pPager
26e10 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  .    pPager->pMm
26e30 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e  apFreelist = p->
26e40 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70  pDirty;.    p->p
26e50 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 61  Dirty = 0;.    a
26e60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
26e70 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20  Extra>=8 );.    
26e80 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72 61  memset(p->pExtra
26e90 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 8);.  }else
26ea0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26eb0 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
26ec0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26ed0 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26ee0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26ef0 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
26f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
26f10 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26f20 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
26f30 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
26f40 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
26f50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26f60 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
26f70 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
26f80 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
26f90 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
26fa0 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
26fb0 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26fc0 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26fd0 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26fe0 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26ff0 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
27000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
27010 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
27020 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
27030 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
27040 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
27050 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
27060 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
27070 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
27080 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
27090 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
270a0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
270b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
270c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
270d0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
270e0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
270f0 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20 68   pPg. pPg must h
27100 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e 65  ave been returne
27110 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c  d by an .** earl
27120 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ier call to page
27130 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27140 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
27150 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61  d pagerReleaseMa
27160 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  pPage(PgHdr *pPg
27170 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
27180 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27190 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61  ;.  pPager->nMma
271a0 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70  pOut--;.  pPg->p
271b0 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e  Dirty = pPager->
271c0 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20  pMmapFreelist;. 
271d0 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
271e0 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20  eelist = pPg;.. 
271f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27200 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69  >fd->pMethods->i
27210 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20  Version>=3 );.  
27220 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
27230 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
27240 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a  4)(pPg->pgno-1)*
27250 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27260 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d  , pPg->pData);.}
27270 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
27280 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 73   PgHdr objects s
27290 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61 67  tored in the Pag
272a0 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  er.pMmapFreelist
272b0 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
272c0 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65 4d   void pagerFreeM
272d0 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70 50  apHdrs(Pager *pP
272e0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
272f0 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  p;.  PgHdr *pNex
27300 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65  t;.  for(p=pPage
27310 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
27320 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20  ; p; p=pNext){. 
27330 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44     pNext = p->pD
27340 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  irty;.    sqlite
27350 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
27360 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  .../*.** Shutdow
27370 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
27380 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
27390 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
273a0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
273b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
273c0 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
273d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
273e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
273f0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
27400 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
27410 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
27420 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
27430 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
27440 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
27450 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
27460 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
27470 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
27480 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
27490 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
274a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
274b0 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
274c0 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
274d0 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
274e0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
274f0 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
27500 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
27510 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
27520 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
27530 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
27540 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
27550 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
27560 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
27570 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
27580 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
27590 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
275a0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
275b0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
275c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
275d0 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
275e0 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ger, sqlite3 *db
275f0 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  ){.  u8 *pTmp = 
27600 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
27610 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65  mpSpace;..  asse
27620 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65 72 55  rt( db || pagerU
27630 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
27640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
27650 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
27660 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69  (pPager) );.  di
27670 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
27680 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
27690 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
276a0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67  nMalloc();.  pag
276b0 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70 50  erFreeMapHdrs(pP
276c0 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ager);.  /* pPag
276d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
276e0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   */.  pPager->ex
276f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
27700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
27710 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
27720 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d  t( db || pPager-
27730 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  >pWal==0 );.  sq
27740 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
27750 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20  ager->pWal, db, 
27760 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
27770 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70  Flags, pPager->p
27780 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 28  ageSize,.      (
27790 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73  db && (db->flags
277a0 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74   & SQLITE_NoCkpt
277b0 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70  OnClose) ? 0 : p
277c0 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61 67  Tmp).  );.  pPag
277d0 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
277e0 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
277f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
27800 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
27810 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
27820 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
27830 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
27840 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
27850 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
27860 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
27870 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
27880 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
27890 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
278a0 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
278b0 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
278c0 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
278d0 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
278e0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
278f0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
27900 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
27910 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
27920 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
27930 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
27940 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
27950 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
27960 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
27970 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
27980 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
27990 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
279a0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
279b0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
279c0 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
279d0 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
279e0 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
279f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
27a00 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
27a10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
27a20 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
27a30 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27a40 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27a50 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
27a60 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
27a70 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
27a80 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
27a90 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
27aa0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
27ab0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
27ac0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27ad0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27ae0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
27af0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
27b00 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
27b10 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
27b20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
27b30 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27b40 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27b50 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
27b60 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
27b70 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
27b80 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
27b90 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
27ba0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27bb0 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
27bc0 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
27bd0 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
27be0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27bf0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
27c00 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
27c10 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
27c20 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
27c30 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27c40 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27c50 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
27c60 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
27c70 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
27c80 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
27c90 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
27ca0 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
27cb0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
27cc0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
27cd0 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
27ce0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
27cf0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
27d00 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
27d10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
27d20 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
27d30 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27d40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d50 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
27d60 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
27d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
27d80 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
27d90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 41  QLITE_ENABLE_TRA
27da0 4e 53 41 43 54 49 4f 4e 5f 50 41 47 45 53 29 0a  NSACTION_PAGES).
27db0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
27dc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
27dd0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
27de0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
27df0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
27e00 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
27e10 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
27e20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
27e30 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
27e40 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
27e50 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
27e60 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
27e70 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27e80 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
27e90 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
27ea0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
27eb0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
27ec0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
27ed0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
27ee0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
27ef0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
27f00 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
27f10 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
27f20 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
27f30 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
27f40 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
27f50 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
27f60 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
27f70 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
27f80 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  er.noSync flag i
27f90 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  s set, then this
27fa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
27fb0 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  o-op..** Otherwi
27fc0 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
27fd0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
27fe0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
27ff0 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ode and the .** 
28000 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
28010 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66 69  istics of the fi
28020 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f  le-system, as fo
28030 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  llows:.**.**   *
28040 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
28050 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65  file is an in-me
28060 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  mory journal fil
28070 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65  e, no action nee
28080 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65  d.**     be take
28090 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68  n..**.**   * Oth
280a0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64  erwise, if the d
280b0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
280c0 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f  upport the SAFE_
280d0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c  APPEND property,
280e0 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65  .**     then the
280f0 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
28100 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
28110 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
28120 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69   header.**     i
28130 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e  s updated to con
28140 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
28150 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  of journal recor
28160 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  ds that have.** 
28170 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e      been written
28180 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49   following it. I
28190 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
281a0 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c  perating in full
281b0 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64  -sync.**     mod
281c0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
281d0 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
281e0 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  ed before this f
281f0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e  ield is updated.
28200 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
28210 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
28220 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45  t support the SE
28230 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74  QUENTIAL propert
28240 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20  y, then .**     
28250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
28260 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72  synced..**.** Or
28270 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65  , in pseudo-code
28280 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f  :.**.**   if( NO
28290 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  T <in-memory jou
282a0 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20  rnal> ){.**     
282b0 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50  if( NOT SAFE_APP
282c0 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20  END ){.**       
282d0 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d  if( <full-sync m
282e0 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f  ode> ) xSync(<jo
282f0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
28300 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e         <update n
28310 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20  Rec field>.**   
28320 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20    } .**     if( 
28330 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29  NOT SEQUENTIAL )
28340 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
28350 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a  file>);.**   }.*
28360 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
28370 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ul, this routine
28380 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44   clears the PGHD
28390 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
283a0 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61   of every .** pa
283b0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ge currently hel
283c0 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f  d in memory befo
283d0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  re returning SQL
283e0 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
283f0 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63  .** error is enc
28400 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74  ountered, then t
28410 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
28420 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20   is returned to 
28430 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73  the caller..*/.s
28440 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
28450 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
28460 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29  ger, int newHdr)
28470 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
284a0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
284b0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
284c0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
284d0 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
284e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
284f0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
28500 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
28510 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28520 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28530 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
28540 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
28550 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
28560 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
28570 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
28580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28590 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
285a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
285b0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73  oSync ){.    ass
285c0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
285d0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66  mpFile );.    if
285e0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
285f0 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
28600 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
28610 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
28620 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
28630 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20  const int iDc = 
28640 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
28650 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
28660 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
28670 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
28680 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
28690 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
286a0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
286b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
286c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
286d0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
286e0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f  h an obscure pro
286f0 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73  blem. If the las
28700 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  t connection.   
28710 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f       ** that wro
28720 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  te to this datab
28730 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e  ase was operatin
28740 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d  g in persistent-
28750 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
28760 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  ** mode, then th
28770 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
28780 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ay at this point
28790 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72   actually be lar
287a0 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ger.        ** t
287b0 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  han Pager.journa
287c0 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20 74  lOff bytes. If t
287d0 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e  he next thing in
287e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
287f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70       ** file hap
28800 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75  pens to be a jou
28810 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69  rnal-header (wri
28820 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tten as part of 
28830 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
28840 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  revious connecti
28850 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  on's transaction
28860 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f  ), and a crash o
28870 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  r power-failure 
28880 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  .        ** occu
28890 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69 73  rs after nRec is
288a0 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65 66   updated but bef
288b0 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ore this connect
288c0 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20  ion writes .    
288d0 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20      ** anything 
288e0 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  else to the jour
288f0 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d  nal file (or com
28900 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20  mits/rolls back 
28910 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  its .        ** 
28920 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68  transaction), th
28930 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65  en SQLite may be
28940 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68  come confused wh
28950 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20  en doing the .  
28960 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75        ** hot-jou
28970 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  rnal rollback fo
28980 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79  llowing recovery
28990 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61  . It may roll ba
289a0 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  ck all.        *
289b0 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  * of this connec
289c0 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e  tions data, then
289d0 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c   proceed to roll
289e0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64  ing back the old
289f0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  ,.        ** out
28a00 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74 68  -of-date data th
28a10 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44  at follows it. D
28a20 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
28a30 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  on..        **. 
28a40 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72         ** To wor
28a50 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69  k around this, i
28a60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
28a70 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20 74  le does appear t
28a80 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  o contain.      
28a90 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61    ** a valid hea
28aa0 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61  der following Pa
28ab0 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  ger.journalOff, 
28ac0 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78 30  then write a 0x0
28ad0 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74  0.        ** byt
28ae0 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  e to the start o
28af0 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20  f it to prevent 
28b00 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65  it from being re
28b10 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20  cognized..      
28b20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28b30 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64  Variable iNextHd
28b40 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
28b50 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 20  o the offset at 
28b60 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20 20  which this.     
28b70 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69     ** problemati
28b80 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63  c header will oc
28b90 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  cur, if it exist
28ba0 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73 65  s. aMagic is use
28bb0 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  d .        ** as
28bc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
28bd0 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74  fer to inspect t
28be0 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20  he first couple 
28bf0 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20  of bytes of.    
28c00 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e      ** the poten
28c10 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tial journal hea
28c20 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  der..        */.
28c30 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 78          i64 iNex
28c40 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  tHdrOffset;.    
28c50 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d      u8 aMagic[8]
28c60 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48 65  ;.        u8 zHe
28c70 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
28c80 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a  rnalMagic)+4];..
28c90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
28ca0 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
28cb0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
28cc0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
28cd0 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
28ce0 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
28cf0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
28d00 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
28d10 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 48  ..        iNextH
28d20 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e  drOffset = journ
28d30 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
28d40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
28d50 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
28d60 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
28d70 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72  gic, 8, iNextHdr
28d80 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
28d90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28da0 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  OK && 0==memcmp(
28db0 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
28dc0 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20  Magic, 8) ){.   
28dd0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
28de0 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20  nst u8 zerobyte 
28df0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
28e00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
28e10 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
28e20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e  &zerobyte, 1, iN
28e30 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
28e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28e60 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
28e70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
28e80 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
28e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28ea0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
28eb0 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
28ec0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
28ed0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
28ee0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
28ef0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
28f00 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
28f10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
28f20 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
28f30 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
28f40 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
28f50 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
28f60 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
28f70 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
28f80 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
28f90 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
28fa0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
28fb0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28fc0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
28fd0 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
28fe0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
28ff0 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
29000 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
29010 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
29020 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
29030 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
29040 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
29050 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
29060 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
29070 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
29080 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
29090 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
290a0 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
290b0 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
290c0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
290d0 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
290e0 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
290f0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
29100 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29110 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
29120 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
29130 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
29140 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
29150 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
29160 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
29170 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
29180 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29190 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41  .          IOTRA
291a0 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22  CE(("JSYNC %p\n"
291b0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
291c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
291d0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
291e0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
291f0 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  cFlags);.       
29200 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29210 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29230 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
29240 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70  DR %p %lld\n", p
29250 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
29260 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20  ournalHdr));.   
29270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29280 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20 20  3OsWrite(.      
29290 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66        pPager->jf
292a0 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
292b0 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61  of(zHeader), pPa
292c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  ger->journalHdr.
292d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
292e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
292f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29310 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
29320 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
29330 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
29340 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
29350 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
29360 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29370 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
29380 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
29390 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
293a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
293b0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
293c0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
293d0 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20  yncFlags| .     
293e0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
293f0 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ncFlags==SQLITE_
29400 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
29410 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
29420 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
29430 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29440 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29450 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
29460 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
29470 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
29480 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
29490 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26 20    if( newHdr && 
294a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
294b0 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
294c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  ) ){.        pPa
294d0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
294e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
294f0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
29500 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
29510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29530 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
29540 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
29550 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
29560 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
29570 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
29580 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
29590 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65  s in noSync mode
295a0 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
295b0 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a  le was just .  *
295c0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73  * successfully s
295d0 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77 61  ynced. Either wa
295e0 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  y, clear the PGH
295f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
29600 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70  g on .  ** all p
29610 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ages..  */.  sql
29620 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
29630 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
29640 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61  >pPCache);.  pPa
29650 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
29660 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29670 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
29680 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
29690 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
296a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
296b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
296c0 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
296d0 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
296e0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
296f0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
29700 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
29710 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
29720 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
29730 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
29740 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
29750 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
29760 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29770 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
29780 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
29790 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
297a0 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
297b0 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
297c0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
297d0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
297e0 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
297f0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
29800 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
29810 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
29820 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
29830 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
29840 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
29850 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
29860 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
29870 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
29880 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
29890 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
298a0 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
298b0 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
298c0 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
298d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
298e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
298f0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
29900 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
29910 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
29920 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
29930 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
29940 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
29950 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
29960 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
29970 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
29980 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
29990 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
299a0 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
299b0 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
299c0 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
299d0 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
299e0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
299f0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
29a00 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
29a10 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
29a20 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
29a30 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
29a40 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
29a50 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
29a60 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
29a70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
29a80 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
29a90 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
29aa0 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
29ab0 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
29ac0 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
29ad0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
29ae0 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
29af0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
29b00 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
29b10 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
29b20 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
29b30 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
29b40 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
29b50 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
29b60 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
29b70 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
29b80 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
29b90 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
29ba0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
29bb0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29bc0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
29bd0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
29be0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
29bf0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
29c00 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
29c10 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
29c20 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29c30 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
29c40 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
29c50 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
29c60 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
29c70 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
29c80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
29c90 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29ca0 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50 61  elist(Pager *pPa
29cb0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73  ger, PgHdr *pLis
29cc0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
29cd0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
29ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
29cf0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
29d00 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
29d10 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
29d20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  for rollback pag
29d30 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42  ers in WRITER_DB
29d40 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  MOD state. */.  
29d50 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
29d60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
29d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29d80 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70 50  ->tempFile || pP
29d90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29da0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29dc0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
29dd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
29de0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
29df0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
29e00 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
29e10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
29e20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29e30 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29e40 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29e50 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29e60 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29e70 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29e80 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29e90 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29ea0 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29eb0 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29ec0 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
29ed0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
29ee0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
29ef0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29f00 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
29f10 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
29f20 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29f30 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29f40 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
29f50 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
29f60 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
29f70 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
29f80 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
29f90 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
29fa0 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29fb0 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29fc0 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29fd0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29fe0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29ff0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
2a000 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
2a010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a020 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
2a030 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
2a040 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
2a050 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
2a060 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
2a070 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
2a080 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
2a090 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
2a0a0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2a0b0 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
2a0c0 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
2a0d0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
2a0e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
2a0f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
2a100 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
2a110 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
2a120 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
2a130 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2a140 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
2a150 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2a160 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
2a170 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
2a180 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
2a190 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
2a1a0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
2a1b0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
2a1c0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
2a1d0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
2a1e0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
2a1f0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
2a200 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
2a210 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
2a220 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
2a230 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
2a240 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
2a250 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
2a260 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
2a270 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
2a280 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
2a290 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
2a2a0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
2a2b0 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
2a2c0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
2a2d0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
2a2e0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
2a2f0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
2a300 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
2a310 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
2a320 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
2a330 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
2a340 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2a350 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
2a360 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
2a370 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
2a380 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
2a390 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
2a3a0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
2a3b0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
2a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
2a3f0 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
2a400 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
2a410 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2a420 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2a430 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
2a440 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
2a450 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
2a460 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
2a470 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
2a480 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
2a490 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2a4a0 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
2a4b0 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
2a4c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2a4d0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
2a4e0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
2a4f0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
2a500 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a510 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
2a520 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2a530 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a540 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2a550 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2a560 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2a570 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2a580 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2a590 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2a5a0 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2a5b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a5c0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2a5d0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2a5e0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2a5f0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a600 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2a610 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2a620 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2a630 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2a640 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2a650 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2a660 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2a670 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2a680 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a690 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a6a0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2a6b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a6c0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2a6d0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2a6e0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2a6f0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2a700 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2a710 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2a720 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2a730 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a740 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2a750 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2a760 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2a770 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2a780 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2a790 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2a7a0 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2a7b0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2a7c0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2a7d0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2a7e0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2a7f0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2a800 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2a810 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2a820 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a830 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2a840 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2a850 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2a860 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2a870 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2a880 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2a890 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a8a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a8b0 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2a8c0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2a8d0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2a8e0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2a8f0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2a900 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a910 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2a920 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a930 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2a940 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2a950 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2a960 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2a970 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2a980 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2a990 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2a9a0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2a9b0 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2a9c0 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2a9d0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a9e0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2a9f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2aa00 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2aa10 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2aa20 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2aa30 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2aa40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2aa50 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2aa60 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2aa70 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2aa80 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   =  SQLITE_OPEN_
2aa90 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c  SUBJOURNAL | SQL
2aaa0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2aab0 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  TE .      | SQLI
2aac0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2aad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2aae0 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20  LUSIVE .      | 
2aaf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2ab00 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69  TEONCLOSE;.    i
2ab10 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20  nt nStmtSpill = 
2ab20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2ab30 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66  tmtSpill;.    if
2ab40 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2ab50 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2ab60 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2ab70 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2ab80 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2ab90 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31   nStmtSpill = -1
2aba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2abb0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2abc0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
2abd0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  , 0, pPager->sjf
2abe0 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53  d, flags, nStmtS
2abf0 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pill);.  }.  ret
2ac00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2ac10 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2ac20 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2ac30 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2ac40 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2ac50 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal. .**.** If 
2ac60 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2ac70 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2ac80 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2ac90 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2aca0 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2acb0 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2acc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2acd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2ace0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2acf0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2ad00 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2ad10 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2ad20 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2ad30 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2ad40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ad50 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2ad60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2ad70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2ad80 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2ad90 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2ada0 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2adb0 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2adc0 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2add0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2ade0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2adf0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2ae00 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2ae10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2ae20 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2ae30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2ae40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2ae50 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2ae60 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2ae70 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2ae80 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2ae90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2aea0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2aeb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2aec0 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2aed0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2aee0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2aef0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2af00 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2af10 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2af20 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2af30 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2af40 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2af50 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2af60 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2af70 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2af80 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2af90 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2afa0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2afb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2afc0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2afd0 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2afe0 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2aff0 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2b000 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2b010 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2b020 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2b030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2b040 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2b050 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2b060 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2b070 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2b080 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2b090 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2b0a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2b0b0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
2b0c0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2b0d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2b0e0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2b0f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b100 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2b110 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b120 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2b130 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2b140 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2b150 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2b160 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2b170 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2b180 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2b190 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2b1a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b1c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2b1d0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2b1e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2b1f0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2b200 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2b210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b220 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2b230 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2b240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2b250 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2b260 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2b270 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2b280 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2b290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b2a0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2b2b0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2b2c0 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2b2d0 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2b2e0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2b2f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2b300 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2b310 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2b320 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b330 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2b340 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2b350 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2b360 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2b370 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2b380 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2b390 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2b3a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2b3b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2b3c0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2b3d0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2b3e0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2b3f0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2b400 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2b410 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2b420 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2b430 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2b440 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2b450 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2b460 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2b470 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2b480 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2b490 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2b4a0 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2b4b0 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2b4c0 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2b4d0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2b4e0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2b4f0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2b500 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2b510 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2b520 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b530 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b550 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b560 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b570 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b580 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b590 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b5a0 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b5b0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b5c0 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b5d0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b5e0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b5f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b600 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b610 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b620 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b630 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b640 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b650 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b660 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2b670 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2b680 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2b690 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2b6a0 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b6b0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2b6c0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b6d0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2b6e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b6f0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2b700 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2b710 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b720 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2b730 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b740 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b750 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2b760 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2b770 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2b780 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2b790 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2b7a0 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2b7b0 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2b7c0 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2b7d0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2b7e0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2b7f0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2b800 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2b810 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2b820 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2b830 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b840 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b850 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b860 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b870 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b880 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b890 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b8a0 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b8b0 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b8c0 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b8d0 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b8e0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b8f0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2b900 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2b910 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2b920 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2b930 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2b940 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2b950 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2b960 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2b970 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2b980 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2b990 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2b9a0 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2b9b0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2b9c0 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2b9d0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2b9e0 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2b9f0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2ba00 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2ba10 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2ba20 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2ba30 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2ba40 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2ba50 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2ba60 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2ba70 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2ba80 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2ba90 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2baa0 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2bab0 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2bac0 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2bad0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2bae0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2baf0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2bb00 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2bb10 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2bb20 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2bb30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bb40 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2bb50 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2bb60 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2bb70 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2bb80 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2bb90 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2bba0 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2bbb0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2bbc0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2bbd0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2bbe0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2bbf0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2bc00 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2bc10 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2bc20 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2bc30 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2bc40 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2bc50 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2bc60 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2bc70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bc80 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2bc90 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2bca0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2bcb0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2bcc0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2bcd0 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2bce0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2bcf0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2bd00 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2bd10 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bd30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2bd40 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2bd50 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2bd60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2bd70 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2bd80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2bd90 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2bda0 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2bdb0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2bdc0 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2bdd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2bde0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2bdf0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2be00 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2be10 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2be20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2be30 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2be40 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2be50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2be60 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2be70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2be80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2be90 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2bea0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2beb0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2bec0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2bed0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2bee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2bef0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2bf00 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2bf10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2bf20 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2bf30 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2bf40 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2bf50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2bf60 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2bf70 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2bf80 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2bf90 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2bfa0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2bfb0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2bfc0 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2bfd0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2bfe0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2bff0 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2c000 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2c010 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2c020 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2c030 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2c040 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2c050 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2c060 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2c070 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2c080 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2c090 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2c0a0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2c0b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2c0c0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2c0d0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2c0e0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2c0f0 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2c100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2c110 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2c120 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2c130 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2c140 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2c150 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2c160 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c170 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2c180 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2c190 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2c1a0 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2c1b0 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2c1c0 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2c1d0 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2c1e0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2c1f0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2c200 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2c210 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2c220 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2c230 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2c240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c250 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2c260 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2c270 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2c280 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2c290 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2c2a0 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2c2b0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2c2c0 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2c2d0 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2c2e0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2c2f0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2c300 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2c310 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2c320 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2c330 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2c340 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2c350 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2c360 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2c370 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2c380 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2c390 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2c3a0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2c3b0 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2c3c0 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2c3d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2c3e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2c3f0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2c400 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2c410 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2c420 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2c430 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2c440 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2c450 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2c460 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2c470 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2c480 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2c490 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2c4a0 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2c4b0 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2c4c0 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2c4d0 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2c4e0 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2c4f0 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2c500 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2c510 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2c520 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2c530 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2c540 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2c550 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2c560 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2c570 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2c580 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2c590 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2c5a0 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2c5b0 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2c5c0 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2c5d0 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2c5e0 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2c5f0 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2c600 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2c610 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2c620 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2c630 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2c640 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2c650 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2c660 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2c670 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2c680 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2c690 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2c6a0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c6b0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2c6c0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2c6d0 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2c6e0 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2c6f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2c700 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2c710 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2c720 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2c730 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2c740 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2c750 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2c760 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2c770 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2c780 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2c790 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2c7a0 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2c7b0 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2c7c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2c7d0 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2c7e0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2c7f0 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2c800 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2c810 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2c820 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2c830 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2c840 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2c850 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2c860 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2c870 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2c880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c890 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2c8a0 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2c8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2c8c0 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2c8d0 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2c8e0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2c8f0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c900 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2c910 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2c920 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2c930 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2c940 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2c950 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2c960 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2c970 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2c980 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2c990 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2c9a0 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2c9b0 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2c9c0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2c9d0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2c9e0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2c9f0 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2ca00 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2ca10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2ca20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2ca30 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2ca40 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2ca50 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2ca60 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2ca70 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2ca80 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2ca90 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2caa0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2cab0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2cac0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   */.  int readOn
2cad0 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ly = 0;        /
2cae0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
2caf0 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69  s a read-only fi
2cb00 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72  le */.  int jour
2cb10 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20  nalFileSize;    
2cb20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2cb30 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a  ocate for each j
2cb40 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63  ournal fd */.  c
2cb50 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
2cb60 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20   0;     /* Full 
2cb70 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65  path to database
2cb80 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
2cb90 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2cba0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2cbb0 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e   bytes in zPathn
2cbc0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  ame */.  int use
2cbd0 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
2cbe0 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
2cbf0 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61  URNAL)==0; /* Fa
2cc00 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72  lse to omit jour
2cc10 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  nal */.  int pca
2cc20 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
2cc30 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
2cc40 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2cc50 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
2cc60 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ache */.  u32 sz
2cc70 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2cc80 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2cc90 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
2cca0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
2ccb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
2ccc0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20   = 0;    /* URI 
2ccd0 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  args to copy */.
2cce0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20    int nUri = 0; 
2ccf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cd00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2cd10 20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55   URI args at *zU
2cd20 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ri */..  /* Figu
2cd30 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20  re out how much 
2cd40 73 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65  space is require
2cd50 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  d for each journ
2cd60 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20  al file-handle. 
2cd70 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74   ** (there are t
2cd80 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20  wo of them, the 
2cd90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
2cda0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2cdb0 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c  ).  */.  journal
2cdc0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2cdd0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2cde0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20  Size(pVfs));..  
2cdf0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2ce00 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2ce10 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2ce20 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2ce30 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2ce40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ce50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2ce60 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2ce70 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2ce80 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2ce90 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2cea0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2ceb0 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2cec0 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2ced0 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2cee0 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2cef0 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2cf00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2cf10 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  PT;.      nPathn
2cf20 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2cf30 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2cf40 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2cf50 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2cf60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2cf70 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2cf80 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2cf90 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2cfa0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2cfb0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2cfc0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2cfd0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2cfe0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2cff0 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2d000 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2d010 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2d020 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2d030 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2d040 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2d050 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2d060 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2d070 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2d080 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2d090 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d0a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2d0b0 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2d0c0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2d0d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2d0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2d0f0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2d100 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2d110 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2d120 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2d130 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2d140 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2d150 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2d160 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2d170 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2d180 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2d190 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2d1a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2d1b0 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2d1c0 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2d1d0 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2d1e0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2d1f0 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2d200 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2d210 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2d220 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2d230 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2d240 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2d250 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2d260 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2d270 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2d280 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2d290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d2a0 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2d2b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2d2c0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2d2d0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2d2e0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2d2f0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2d300 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2d310 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2d320 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2d330 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2d340 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2d350 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2d360 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2d370 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2d380 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2d390 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2d3a0 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2d3b0 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2d3c0 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2d3d0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2d3e0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2d3f0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2d400 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2d410 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2d420 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2d430 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d440 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d450 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2d460 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2d470 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2d490 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2d4a0 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2d4b0 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2d4c0 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2d4d0 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2d4e0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2d4f0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2d500 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2d510 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2d520 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2d530 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2d540 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2d550 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d570 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2d580 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2d590 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d5b0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2d5c0 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2d5d0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2d5e0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2d5f0 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2d600 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2d610 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2d620 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2d630 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2d640 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2d650 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2d660 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d670 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2d680 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2d690 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d6a0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2d6b0 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2d6c0 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2d6d0 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2d6e0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2d6f0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2d700 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2d710 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2d720 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2d730 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2d740 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2d750 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2d760 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2d770 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d780 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2d790 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2d7a0 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2d7b0 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2d7c0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d7d0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d7e0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d7f0 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d800 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d810 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d820 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d830 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d840 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d850 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d860 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d870 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d880 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d890 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d8a0 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d8c0 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d8e0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d8f0 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d900 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d910 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d920 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d930 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d940 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d950 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2d960 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67  BKPT;.  }.  pPag
2d970 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2d980 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2d990 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2d9a0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2d9b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2d9c0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2d9d0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2d9e0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2d9f0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2da00 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2da10 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2da20 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2da30 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2da40 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2da50 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2da60 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2da70 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2da80 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2da90 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2daa0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2dab0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2dac0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2dad0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2dae0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2daf0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2db00 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2db10 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2db20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2db30 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2db40 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2db50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2db60 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2db70 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2db80 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2db90 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2dba0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2dbb0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2dbc0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2dbd0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2dbe0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
2dbf0 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79  f( nUri ) memcpy
2dc00 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  (&pPager->zFilen
2dc10 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
2dc20 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
2dc30 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72     memcpy(pPager
2dc40 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74  ->zJournal, zPat
2dc50 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2dc60 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2dc70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2dc80 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f  nPathname], "-jo
2dc90 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29  urnal\000", 8+2)
2dca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c  ;.    sqlite3Fil
2dcb0 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d  eSuffix3(pPager-
2dcc0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2dcd0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23  er->zJournal);.#
2dce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2dcf0 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2dd00 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2dd10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2dd20 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2dd30 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2dd40 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2dd50 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2dd60 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2dd70 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2dd80 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31   "-wal\000", 4+1
2dd90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2dda0 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2ddb0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2ddc0 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64  ger->zWal);.#end
2ddd0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  if.    sqlite3Db
2dde0 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2ddf0 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  e);.  }.  pPager
2de00 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
2de10 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
2de20 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20  s = vfsFlags;.. 
2de30 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
2de40 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
2de50 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2de60 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2de70 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
2de80 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2de90 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
2dea0 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
2deb0 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
2dec0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2ded0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2dee0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2def0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
2df00 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  &fout);.    asse
2df10 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20  rt( !memDb );.  
2df20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2df30 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2df40 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
2df50 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
2df60 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
2df70 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
2df80 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
2df90 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
2dfa0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2dfb0 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
2dfc0 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
2dfd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
2dfe0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
2dff0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
2e000 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
2e010 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
2e020 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2e030 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
2e040 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
2e050 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2e060 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
2e070 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2e080 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
2e090 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
2e0a0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
2e0b0 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
2e0c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e0d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63  ){.      int iDc
2e0e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
2e0f0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2e100 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
2e110 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f 6e       if( !readOn
2e120 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
2e130 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2e140 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
2e150 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
2e160 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
2e170 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2e180 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
2e190 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44       if( szPageD
2e1a0 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74  flt<pPager->sect
2e1b0 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  orSize ){.      
2e1c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e1d0 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54  sectorSize>SQLIT
2e1e0 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e1f0 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  GE_SIZE ){.     
2e200 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2e210 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
2e220 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e230 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2e240 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e{.            s
2e250 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32  zPageDflt = (u32
2e260 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  )pPager->sectorS
2e270 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
2e280 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
2e290 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e2a0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2e2b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
2e2c0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
2e2d0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e2e0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
2e2f0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
2e300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2e310 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2e320 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2e330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2e340 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
2e350 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e360 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
2e370 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2e380 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2e390 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2e3a0 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2e3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2e3c0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2e3d0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2e3e0 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2e3f0 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2e400 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
2e410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e420 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
2e430 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  f.      }.      
2e440 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e450 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2e460 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2e470 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20  "nolock", 0);.  
2e480 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20 53      if( (iDc & S
2e490 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55  QLITE_IOCAP_IMMU
2e4a0 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20 20  TABLE)!=0.      
2e4b0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   || sqlite3_uri_
2e4c0 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2e4d0 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20  e, "immutable", 
2e4e0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
2e4f0 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  vfsFlags |= SQLI
2e500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2e510 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2e520 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66   act_like_temp_f
2e530 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ile;.      }.   
2e540 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2e550 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
2e560 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
2e570 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
2e580 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
2e590 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
2e5a0 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
2e5b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
2e5c0 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
2e5d0 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
2e5e0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
2e5f0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
2e600 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
2e610 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
2e620 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
2e630 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
2e640 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
2e650 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
2e660 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
2e670 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
2e680 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
2e690 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
2e6a0 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
2e6b0 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
2e6c0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
2e6d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
2e6e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2e6f0 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72 75  s branch also ru
2e700 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61 72  ns for files mar
2e710 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c 65  ked as immutable
2e720 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69  ..    */ .act_li
2e730 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20  ke_temp_file:.  
2e740 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2e750 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2e760 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2e770 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65 6e  R;     /* Preten
2e780 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  d we already hav
2e790 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  e a lock */.    
2e7a0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
2e7b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20  EXCLUSIVE_LOCK; 
2e7c0 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65     /* Pretend we
2e7d0 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49 56   are in EXCLUSIV
2e7e0 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50  E mode */.    pP
2e7f0 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31  ager->noLock = 1
2e800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e810 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e   /* Do no lockin
2e820 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c  g */.    readOnl
2e830 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
2e840 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2e850 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
2e860 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
2e870 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
2e880 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
2e890 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
2e8a0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
2e8b0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
2e8c0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
2e8d0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
2e8e0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
2e8f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e900 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e910 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
2e920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e930 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2e940 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
2e950 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
2e960 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
2e970 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
2e980 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2e990 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2e9a0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2e9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e9c0 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2e9d0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 61 73 73  nExtra);.    ass
2e9e0 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 38 20 26  ert( nExtra>=8 &
2e9f0 26 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29 3b  & nExtra<1000 );
2ea00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ea10 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61  3PcacheOpen(szPa
2ea20 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20  geDflt, nExtra, 
2ea30 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20  !memDb,.        
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21                 !
2ea50 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73  memDb?pagerStres
2ea60 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  s:0, (void *)pPa
2ea70 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43  ger, pPager->pPC
2ea80 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ache);.  }..  /*
2ea90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2eaa0 75 72 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65  urred above, fre
2eab0 65 20 74 68 65 20 20 50 61 67 65 72 20 73 74 72  e the  Pager str
2eac0 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
2ead0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
2eae0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eaf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
2eb00 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2eb10 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
2eb20 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
2eb30 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
2eb40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2eb50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2eb60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
2eb70 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
2eb80 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
2eb90 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
2eba0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
2ebb0 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
2ebc0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
2ebd0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2ebe0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2ebf0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ..  pPager->useJ
2ec00 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
2ec10 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50  Journal;.  /* pP
2ec20 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
2ec30 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2ec40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
2ec50 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2ec60 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
2ec70 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2ec80 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
2ec90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
2eca0 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
2ecb0 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
2ecc0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2ecd0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
2ece0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
2ecf0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2ed00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
2ed10 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
2ed20 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2ed30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2ed40 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2ed50 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2ed60 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2ed70 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2ed80 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2ed90 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2eda0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2edb0 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2edc0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2edd0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2ede0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2edf0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2ee00 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2ee10 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2ee20 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2ee30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2ee40 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2ee50 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2ee60 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2ee70 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2ee80 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2ee90 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2eea0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2eeb0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2eec0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2eed0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2eee0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2eef0 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2ef00 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2ef10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2ef20 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  xtraSync==0 );. 
2ef30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ef40 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2ef50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ef60 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2ef70 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2ef80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2ef90 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2efa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2efb0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2efc0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2efd0 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
2efe0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2eff0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2f000 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2f010 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2f020 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2f030 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2f040 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2f050 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2f060 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2f070 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2f080 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2f090 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2f0a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f0b0 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2f0c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2f0d0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2f0e0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2f0f0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2f100 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2f110 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2f120 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2f130 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2f140 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2f150 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2f160 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2f170 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2f180 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2f190 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2f1a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2f1b0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2f1c0 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2f1d0 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2f1e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f1f0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f200 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2f210 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2f220 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2f230 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2f240 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2f250 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2f260 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2f270 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2f280 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
2f290 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65  pPager);.  /* me
2f2a0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2f2b0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2f2c0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2f2d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2f2e0 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2f2f0 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2f300 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2f310 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2f320 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2f330 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2f340 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2f350 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2f360 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2f370 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2f380 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2f390 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2f3a0 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2f3b0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2f3c0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2f3d0 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2f3e0 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2f3f0 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2f400 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2f410 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2f420 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2f430 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2f440 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2f450 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2f460 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2f470 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2f480 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2f490 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2f4a0 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2f4b0 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2f4c0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2f4d0 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2f4e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2f4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2f500 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2f510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2f520 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2f530 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2f540 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2f550 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2f560 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2f570 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2f580 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2f590 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2f5a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2f5b0 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2f5c0 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2f5d0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2f5e0 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2f5f0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2f600 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2f610 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2f620 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2f630 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2f640 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2f650 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2f660 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2f670 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2f680 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2f690 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2f6a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f6b0 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2f6c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2f6d0 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2f6e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f6f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2f700 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f710 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2f720 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2f730 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2f740 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2f750 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2f760 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2f770 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2f780 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2f790 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2f7a0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2f7b0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2f7c0 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2f7d0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2f7e0 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2f7f0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2f800 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2f810 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2f820 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2f830 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2f840 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2f850 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2f860 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2f870 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2f880 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2f890 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2f8a0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2f8b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f8c0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2f8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2f8e0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2f8f0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2f900 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2f910 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2f920 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f930 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2f940 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2f950 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2f960 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2f970 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2f980 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2f990 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2f9a0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2f9b0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2f9c0 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2f9d0 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2f9e0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2f9f0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2fa00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2fa10 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2fa20 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2fa30 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2fa40 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2fa50 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2fa60 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2fa70 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2fa80 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2fa90 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2faa0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2fab0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2fac0 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2fad0 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2fae0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2faf0 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2fb00 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2fb10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2fb20 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2fb30 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2fb40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2fb50 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2fb60 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2fb70 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2fb80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2fb90 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2fba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fbb0 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2fbc0 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2fbd0 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2fbe0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2fbf0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2fc00 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2fc10 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2fc20 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2fc30 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2fc40 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2fc50 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2fc60 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2fc70 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2fc80 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2fc90 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2fca0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2fcb0 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2fcc0 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2fcd0 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2fce0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2fcf0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2fd00 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2fd10 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2fd20 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2fd30 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2fd40 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2fd50 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2fd60 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2fd70 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2fd80 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2fd90 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2fda0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2fdb0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2fdc0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2fdd0 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2fde0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2fdf0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2fe00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2fe10 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2fe20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2fe30 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2fe40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2fe50 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2fe60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2fe70 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2fe80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2fe90 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2fea0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2feb0 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2fec0 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2fed0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2fee0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2fef0 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2ff00 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2ff10 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2ff20 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2ff30 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2ff40 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2ff50 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2ff60 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2ff70 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2ff80 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2ff90 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2ffa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ffb0 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2ffc0 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2ffd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ffe0 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2fff0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
30000 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
30010 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
30020 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
30030 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
30040 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
30050 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
30060 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
30070 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
30080 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
30090 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
300a0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
300b0 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
300c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
300d0 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
300e0 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
300f0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
30100 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
30110 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
30120 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
30130 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
30140 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
30150 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
30160 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
30170 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
30180 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
30190 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
301a0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
301b0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
301c0 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
301d0 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
301e0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
301f0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
30200 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
30210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
30220 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
30230 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
30240 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
30250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
30260 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
30270 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30290 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
302a0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
302b0 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
302c0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
302d0 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ile==0 );.      
302e0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
302f0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
30300 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
30310 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30320 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
30330 65 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65  e database is ze
30340 72 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ro pages in size
30350 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
30360 74 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65  t either (1) the
30370 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
30380 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74  nal is a remnant
30390 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61   from a prior da
303a0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
303b0 73 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a  same name where.
303c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
303d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74  atabase file but
303e0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
303f0 20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72   was deleted, or
30400 20 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c   (2) the initial
30410 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
30420 73 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70  saction that pop
30430 75 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74  ulates a new dat
30440 61 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72  abase is being r
30450 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
30460 20 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72      ** In either
30470 20 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e   case, the journ
30480 61 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64  al file can be d
30490 65 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72  eleted.  However
304a0 2c 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20  , take care.    
304b0 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65      ** not to de
304c0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
304d0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61   file if it is a
304e0 6c 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20  lready open due 
304f0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  to.        ** jo
30500 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49  urnal_mode=PERSI
30510 53 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ST..        */. 
30520 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65         if( nPage
30530 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e  ==0 && !jrnlOpen
30540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
30550 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
30560 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
30570 20 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63      if( pagerLoc
30580 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
30590 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49  RVED_LOCK)==SQLI
305a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
305b0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
305c0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
305d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
305e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
305f0 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
30600 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55  iveMode ) pagerU
30610 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
30620 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
30630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30640 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
30650 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
30660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30670 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
30680 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
30690 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63  s and no other c
306a0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20  onnection has a 
306b0 72 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20  reserved.       
306c0 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72     ** or greater
306d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
306e0 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20  abase file. Now 
306f0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65  check that there
30700 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
30710 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f   at least one no
30720 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20  n-zero bytes at 
30730 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
30740 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
30750 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
30760 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65  here is, then we
30770 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a   consider this j
30780 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74  ournal to be hot
30790 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20  . If not, .     
307a0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
307b0 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
307c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
307d0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
307e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
307f0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
30800 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
30810 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30820 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
30830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30840 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
30850 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30860 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
30870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
30890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
308a0 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73           u8 firs
308b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
308c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
308d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
308e0 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73  d, (void *)&firs
308f0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 1, 0);.      
30900 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
30910 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
30920 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
30930 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30940 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
30950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
30960 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30970 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30980 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
30990 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
309a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
309b0 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
309c0 3d 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20  = (first!=0);.  
309d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
309e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e  ( rc==SQLITE_CAN
309f0 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20  TOPEN ){.       
30a00 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61       /* If we ca
30a10 6e 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f  nnot open the ro
30a20 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
30a30 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
30a40 73 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20  see if.         
30a50 20 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a     ** it has a z
30a60 65 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74  ero header, that
30a70 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
30a80 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f   an I/O error, o
30a90 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
30aa0 20 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65   it might be due
30ab0 20 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e   to the race con
30ac0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
30ad0 20 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20   above and in.  
30ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63            ** tic
30af0 6b 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68  ket #3883.  Eith
30b00 65 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74  er way, assume t
30b10 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
30b20 69 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20  is hot..        
30b30 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68      ** This migh
30b40 74 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73  t be a false pos
30b50 69 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69  itive.  But if i
30b60 74 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20  t is, then the. 
30b70 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75             ** au
30b80 74 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20  tomatic journal 
30b90 70 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63  playback and rec
30ba0 6f 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20  overy mechanism 
30bb0 77 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20  will deal.      
30bc0 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74        ** with it
30bd0 20 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53   under an EXCLUS
30be0 49 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77  IVE lock where w
30bf0 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  e do not need to
30c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
30c10 77 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69  worry so much wi
30c20 74 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  th race conditio
30c30 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ns..            
30c40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  */.            *
30c50 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  pExists = 1;.   
30c60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
30c70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
30c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
30c90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
30ca0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
30cb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30cc0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
30cd0 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
30ce0 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ed lock on the d
30cf0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
30d00 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30d10 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  o call sqlite3Pa
30d20 67 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61  gerGet() until a
30d30 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
30d40 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
30d50 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
30d60 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
30d70 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
30d80 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
30d90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
30da0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
30db0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
30dc0 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
30dd0 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
30de0 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
30df0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
30e00 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
30e10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
30e20 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
30e30 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a  e (no lock held.
30e40 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64  **      on the d
30e50 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74  atabase file), t
30e60 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
30e70 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
30e80 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45   a.**      SHARE
30e90 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
30ea0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d  tabase file. Imm
30eb0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
30ec0 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  btaining.**     
30ed0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
30ee0 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  , the file-syste
30ef0 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72  m is checked for
30f00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a   a hot-journal,.
30f10 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73  **      which is
30f20 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20   played back if 
30f30 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69  present. Followi
30f40 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e  ng any hot-journ
30f50 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c  al .**      roll
30f60 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e  back, the conten
30f70 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20  ts of the cache 
30f80 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79  are validated by
30f90 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20   checking.**    
30fa0 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f    the 'change-co
30fb0 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20  unter' field of 
30fc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30fd0 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20  e header and.** 
30fe0 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69       discarded i
30ff0 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64  f they are found
31000 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a   to be invalid..
31010 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68  **.**   2) If th
31020 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
31030 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
31040 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20  mode, and there 
31050 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
31060 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e        no outstan
31070 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
31080 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e  to any pages, an
31090 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  d is in the erro
310a0 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20  r state,.**     
310b0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
310c0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61   is made to clea
310d0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
310e0 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a  e by discarding.
310f0 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74  **      the cont
31100 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
31110 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69   cache and rolli
31120 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e  ng back any open
31130 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
31140 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
31150 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
31160 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
31170 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
31180 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
31190 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
311a0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
311b0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
311c0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
311d0 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f  l file or .** ro
311e0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
311f0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
31200 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
31210 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
31220 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
31230 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
31240 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
31250 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
31260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31270 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
31280 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
31290 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
312a0 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64   from b-tree and
312b0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65   only when there
312c0 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74   are no.  ** out
312d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20  standing pages. 
312e0 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61  This implies tha
312f0 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74  t the pager stat
31300 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a  e should either.
31310 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20    ** be OPEN or 
31320 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69  READER. READER i
31330 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20  s only possible 
31340 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
31350 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20  or was in .  ** 
31360 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
31370 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73   mode.  */.  ass
31380 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
31390 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
313a0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
313b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
313c0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
313d0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
313e0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
313f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
31400 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
31410 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
31420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31430 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
31440 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
31450 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
31460 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
31470 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31480 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  PEN ){.    int b
31490 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20  HotJournal = 1; 
314a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
314b0 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
314c0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66   a hot journal-f
314d0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  ile */..    asse
314e0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
314f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31500 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
31510 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
31520 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
31530 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ;..    rc = page
31540 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
31550 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
31560 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
31570 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31580 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31590 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
315a0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  CK || pPager->eL
315b0 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock==UNKNOWN_LOC
315c0 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K );.      goto 
315d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
315e0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
315f0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
31600 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
31610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
31620 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
31630 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
31640 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
31650 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
31660 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
31670 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
31680 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52  ger->eLock<=SHAR
31690 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  ED_LOCK ){.     
316a0 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
316b0 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f  nal(pPager, &bHo
316c0 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d  tJournal);.    }
316d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
316e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
316f0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
31700 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a   }.    if( bHotJ
31710 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
31720 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
31730 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
31740 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
31750 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  ONLY_ROLLBACK;. 
31760 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
31770 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
31780 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
31790 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
317a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
317b0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
317c0 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
317d0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
317e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
317f0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
31800 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
31810 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
31820 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
31830 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
31840 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
31850 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
31860 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
31870 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
31880 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
31890 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
318a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
318b0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
318c0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
318d0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
318e0 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
318f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
31900 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
31910 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
31920 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
31930 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
31940 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
31950 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
31960 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
31970 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
31980 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31990 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
319a0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
319b0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
319c0 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
319d0 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
319e0 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
319f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
31a00 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a   file..      **.
31a10 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20        ** Unless 
31a20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
31a30 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
31a40 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
31a50 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a   lock is.      *
31a60 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20  * downgraded to 
31a70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f  SHARED_LOCK befo
31a80 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
31a90 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20   returns..      
31aa0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
31ab0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
31ac0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
31ad0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
31ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31af0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31b00 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  d;.      }. .   
31b10 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e     /* If it is n
31b20 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ot already open 
31b30 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69  and the file exi
31b40 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65  sts on disk, ope
31b50 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
31b60 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
31b70 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57  /write access. W
31b80 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72  rite access is r
31b90 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
31ba0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63  .      ** in exc
31bb0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
31bc0 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
31bd0 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
31be0 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20  ept open .      
31bf0 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  ** and possibly 
31c00 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
31c10 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
31c20 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63   Also, write-acc
31c30 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73  ess .      ** is
31c40 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65   usually require
31c50 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  d to finalize th
31c60 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75  e journal in jou
31c70 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73  rnal_mode=persis
31c80 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  t .      ** mode
31c90 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a   (and also for j
31ca0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e  ournal_mode=trun
31cb0 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73  cate on some sys
31cc0 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a  tems)..      **.
31cd0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
31ce0 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
31cf0 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c   exist, it usual
31d00 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  ly means that so
31d10 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  me .      ** oth
31d20 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61  er connection ma
31d30 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20  naged to get in 
31d40 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  and roll it back
31d50 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a   before .      *
31d60 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  * this connectio
31d70 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65  n obtained the e
31d80 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62  xclusive lock ab
31d90 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20  ove. Or, it .   
31da0 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74     ** may mean t
31db0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61  hat the pager wa
31dc0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73  s in the error-s
31dd0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20  tate when this. 
31de0 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
31df0 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20   was called and 
31e00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31e10 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
31e20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
31e30 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
31e40 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
31e50 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
31e60 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
31e70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
31e80 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73       int bExists
31e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
31ea0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
31eb0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  l file exists */
31ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
31ed0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
31ee0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
31ef0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31f00 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
31f10 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74  _EXISTS, &bExist
31f20 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
31f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
31f40 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20   bExists ){.    
31f50 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
31f60 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
31f70 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
31f80 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31f90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31fa0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
31fb0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
31fc0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
31fd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31fe0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
31ff0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
32000 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
32010 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
32020 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32030 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
32040 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32050 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
32060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32070 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  && fout&SQLITE_O
32080 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
32090 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
320a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
320b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
320c0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
320d0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
320e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
320f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a      }.      }. .
32100 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
32110 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
32120 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
32130 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
32140 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
32150 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
32160 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
32170 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
32180 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
32190 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
321a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
321b0 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
321c0 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
321d0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
321e0 20 63 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68   cache.  Sync th
321f0 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65  e hot journal be
32200 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20  fore playing.   
32210 20 20 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69     ** it back si
32220 6e 63 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  nce the process 
32230 74 68 61 74 20 63 72 61 73 68 65 64 20 61 6e 64  that crashed and
32240 20 6c 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f   left the hot jo
32250 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70  urnal.      ** p
32260 72 6f 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20  robably did not 
32270 73 79 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61  sync it and we a
32280 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 61  re required to a
32290 6c 77 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20  lways sync.     
322a0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
322b0 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69  before playing i
322c0 74 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f  t back..      */
322d0 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
322e0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
322f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
32310 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
32320 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
32330 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
32340 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32360 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
32370 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
32380 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
32390 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  e);.          pP
323a0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
323b0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20  AGER_OPEN;.     
323c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
323d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
323e0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
323f0 20 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f         pagerUnlo
32400 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
32410 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
32420 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
32430 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32440 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
32450 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69  ranch is taken i
32460 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
32470 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
32480 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a  o open.        *
32490 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61  * or roll back a
324a0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69   hot-journal whi
324b0 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  le holding an EX
324c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
324d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
324e0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  er_unlock() rout
324f0 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
32500 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
32510 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20  ing to unlock.  
32520 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c        ** the fil
32530 65 2e 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b  e. If the unlock
32540 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20   attempt fails, 
32550 74 68 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b  then Pager.eLock
32560 20 6d 75 73 74 20 62 65 0a 20 20 20 20 20 20 20   must be.       
32570 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   ** set to UNKNO
32580 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65  WN_LOCK (see the
32590 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
325a0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a  he #define for .
325b0 20 20 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f          ** UNKNO
325c0 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f  WN_LOCK above fo
325d0 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
325e0 29 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ). .        **. 
325f0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64         ** In ord
32600 65 72 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f  er to get pager_
32610 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74  unlock() to do t
32620 68 69 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65  his, set Pager.e
32630 53 74 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20  State to.       
32640 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20   ** PAGER_ERROR 
32650 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  now. This is not
32660 20 61 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65   actually counte
32670 64 20 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f  d as a transitio
32680 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  n.        ** to 
32690 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74  ERROR state in t
326a0 68 65 20 73 74 61 74 65 20 64 69 61 67 72 61 6d  he state diagram
326b0 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
326c0 68 69 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20  his file,.      
326d0 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e    ** since we kn
326e0 6f 77 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ow that the same
326f0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
32700 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72  nlock() will ver
32710 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f  y.        ** sho
32720 72 74 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20  rtly transition 
32730 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
32740 20 74 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61   to the OPEN sta
32750 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20  te. Calling.    
32760 20 20 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61      ** assert_pa
32770 67 65 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c  ger_state() woul
32780 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69  d fail now, as i
32790 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
327a0 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20  possible.       
327b0 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52   ** to be in ERR
327c0 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  OR state when th
327d0 65 72 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74  ere are zero out
327e0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20  standing page . 
327f0 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65         ** refere
32800 6e 63 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nces..        */
32810 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
32820 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
32830 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
32840 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
32850 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
32860 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32870 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20  GER_OPEN );.    
32880 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
32890 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  r->eLock==SHARED
328a0 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20  _LOCK).         
328b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
328c0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
328d0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41  Pager->eLock>SHA
328e0 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
328f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32900 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
32910 69 6c 65 20 26 26 20 70 50 61 67 65 72 2d 3e 68  ile && pPager->h
32920 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
32930 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
32940 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
32950 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
32960 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20 74  red then check t
32970 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69  o.      ** see i
32980 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
32990 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
329a0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
329b0 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 0a  se has changed,.
329c0 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20 74        ** flush t
329d0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20 68  he cache.  The h
329e0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
329f0 20 66 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74   flag prevents t
32a00 68 69 73 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a  his from.      *
32a10 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f 6e 20 74  * occurring on t
32a20 68 65 20 76 65 72 79 20 66 69 72 73 74 20 61 63  he very first ac
32a30 63 65 73 73 20 74 6f 20 61 20 66 69 6c 65 2c 20  cess to a file, 
32a40 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 61 76 65  in order to save
32a50 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
32a60 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  le unnecessary s
32a70 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 63  qlite3OsRead() c
32a80 61 6c 6c 20 61 74 20 74 68 65 20 73 74 61 72 74  all at the start
32a90 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -up..      **.  
32aa0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
32ab0 63 68 61 6e 67 65 73 20 61 72 65 20 64 65 74 65  changes are dete
32ac0 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
32ad0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
32ae0 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61  nning.      ** a
32af0 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
32b00 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
32b10 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
32b20 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
32b30 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20      ** a 32-bit 
32b40 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20  counter that is 
32b50 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68  incremented with
32b60 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54   each change.  T
32b70 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  he.      ** othe
32b80 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72  r bytes change r
32b90 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63  andomly with eac
32ba0 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68  h file change wh
32bb0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  en.      ** a co
32bc0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
32bd0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32be0 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e  * There is a van
32bf0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63  ishingly small c
32c00 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61  hance that a cha
32c10 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nge will not be 
32c20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74  .      ** detect
32c30 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20  ed.  The chance 
32c40 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64  of an undetected
32c50 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d   change is so sm
32c60 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a  all that.      *
32c70 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
32c80 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  ected..      */.
32c90 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
32ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
32cb0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
32cc0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
32cd0 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20  eVers)];..      
32ce0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
32cf0 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
32d00 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
32d10 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b  c ) goto failed;
32d20 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ..      if( nPag
32d30 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
32d40 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
32d50 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
32d60 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32d70 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
32d80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
32d90 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
32da0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32db0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
32dc0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
32dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
32de0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
32df0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
32e00 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
32e10 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
32e20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
32e30 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62         memset(db
32e40 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a  FileVers, 0, siz
32e50 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
32e60 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32e70 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67   if( memcmp(pPag
32e80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
32e90 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
32ea0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21  of(dbFileVers))!
32eb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  =0 ){.        pa
32ec0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
32ed0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  );..        /* U
32ee0 6e 6d 61 70 20 74 68 65 20 64 61 74 61 62 61 73  nmap the databas
32ef0 65 20 66 69 6c 65 2e 20 49 74 20 69 73 20 70 6f  e file. It is po
32f00 73 73 69 62 6c 65 20 74 68 61 74 20 65 78 74 65  ssible that exte
32f10 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 0a 20  rnal processes. 
32f20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68 61         ** may ha
32f30 76 65 20 74 72 75 6e 63 61 74 65 64 20 74 68 65  ve truncated the
32f40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
32f50 6e 64 20 74 68 65 6e 20 65 78 74 65 6e 64 65 64  nd then extended
32f60 20 69 74 20 62 61 63 6b 0a 20 20 20 20 20 20 20   it back.       
32f70 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72 69 67 69   ** to its origi
32f80 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c 65 20 74  nal size while t
32f90 68 69 73 20 70 72 6f 63 65 73 73 20 77 61 73 20  his process was 
32fa0 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f  not holding a lo
32fb0 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ck..        ** I
32fc0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
32fd0 65 20 6d 61 79 20 65 78 69 73 74 20 61 20 50 61  e may exist a Pa
32fe0 67 65 72 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67  ger.pMap mapping
32ff0 20 74 68 61 74 20 61 70 70 65 61 72 73 0a 20 20   that appears.  
33000 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74        ** to be t
33010 68 65 20 72 69 67 68 74 20 73 69 7a 65 20 62 75  he right size bu
33020 74 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  t is not actuall
33030 79 20 76 61 6c 69 64 2e 20 41 76 6f 69 64 20 74  y valid. Avoid t
33040 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
33050 6f 73 73 69 62 69 6c 69 74 79 20 62 79 20 75 6e  ossibility by un
33060 6d 61 70 70 69 6e 67 20 74 68 65 20 64 62 20 68  mapping the db h
33070 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
33080 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
33090 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
330a0 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
330b0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
330c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
330d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
330e0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
330f0 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
33100 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
33110 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
33120 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
33130 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
33140 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
33150 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
33160 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
33170 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
33180 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
33190 28 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65  (pPager);.#ifnde
331a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
331b0 4c 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  L.    assert( pP
331c0 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c  ager->pWal==0 ||
331d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
331e0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
331f0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
33200 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
33210 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
33220 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
33230 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
33240 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
33250 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
33260 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
33270 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  =0 && pPager->eS
33280 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
33290 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
332a0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
332b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
332c0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
332d0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
332e0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
332f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33300 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
33310 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
33320 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
33330 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33340 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
33350 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
33360 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
33370 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
33380 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
33390 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
333a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
333b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
333c0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
333d0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
333e0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
333f0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
33400 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
33410 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
33420 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
33430 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
33440 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
33450 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
33460 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
33470 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
33480 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
33490 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
334a0 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
334b0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
334c0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
334d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
334e0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
334f0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
33500 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
33520 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
33530 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
33540 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
33550 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
33560 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
33570 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
33580 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   }.}../*.** The 
33590 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68  page getter meth
335a0 6f 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20  ods each try to 
335b0 61 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65  acquire a refere
335c0 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65  nce to a.** page
335d0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
335e0 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72  r pgno. If the r
335f0 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
33600 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
33610 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
33620 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
33630 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
33640 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
33650 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
33660 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65   different imple
33670 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
33680 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20  e getter method 
33690 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20  depending.** on 
336a0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
336b0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a  e of the pager..
336c0 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67  **.**     getPag
336d0 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20  eNormal()       
336e0 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c    --  The normal
336f0 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67   getter.**     g
33700 65 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20  etPageError()   
33710 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
33720 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
33730 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
33740 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  e.**     getPage
33750 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20  Mmap()          
33760 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d   --  Used if mem
33770 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69  ory-mapped I/O i
33780 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20  s enabled.**.** 
33790 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
337a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
337b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
337c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
337d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
337e0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
337f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
33800 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33810 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
33820 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33830 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33840 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
33850 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
33860 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
33870 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
33880 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
33890 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
338a0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
338b0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
338c0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
338d0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
338e0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
338f0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33900 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33910 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33920 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33930 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33940 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
33950 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
33960 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33970 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
33980 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
33990 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
339a0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
339b0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
339c0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
339d0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
339e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
339f0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33a00 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33a10 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33a20 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67   if .** the flag
33a30 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
33a40 61 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47  ains the PAGER_G
33a50 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74  ET_NOCONTENT bit
33a60 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
33a70 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
33a80 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
33a90 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
33aa0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
33ab0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
33ac0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
33ad0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
33ae0 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
33af0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
33b00 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
33b10 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f  .**.** If PAGER_
33b20 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73  GET_NOCONTENT is
33b30 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
33b40 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
33b50 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
33b60 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
33b70 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
33b80 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  rs in two scenar
33b90 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
33ba0 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66  When reading a f
33bb0 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
33bc0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
33bd0 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  base, and.**.** 
33be0 20 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65    b) When a save
33bf0 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72  point is being r
33c00 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77  olled back and w
33c10 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a  e need to load.*
33c20 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67  *      a new pag
33c30 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  e into the cache
33c40 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69   to be filled wi
33c50 74 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64  th the data read
33c60 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
33c70 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72  e savepoint jour
33c80 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41  nal..**.** If PA
33c90 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33ca0 54 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  T is true, then 
33cb0 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65  the data returne
33cc0 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74  d is zeroed inst
33cd0 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20  ead.** of being 
33ce0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
33cf0 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e  tabase. Addition
33d00 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63  ally, the bits c
33d10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
33d20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72  to pgno in Pager
33d30 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74  .pInJournal (bit
33d40 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
33d50 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
33d60 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
33d70 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67  ile) and the Pag
33d80 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
33d90 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
33da0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20   of any open.** 
33db0 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73  savepoints are s
33dc0 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  et. This means i
33dd0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  f the page is ma
33de0 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61  de writable at a
33df0 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74  ny.** point in t
33e00 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67  he future, using
33e10 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
33e20 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20  e3PagerWrite(), 
33e30 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  its contents.** 
33e40 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72  will not be jour
33e50 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65  naled. This save
33e60 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s IO..**.** The 
33e70 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
33e80 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
33e90 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
33ea0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
33eb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
33ec0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
33ed0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
33ee0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
33ef0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
33f00 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
33f10 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
33f20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
33f30 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
33f40 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
33f50 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
33f60 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
33f70 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33f80 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
33f90 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
33fa0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
33fb0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
33fc0 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
33fd0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
33fe0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
33ff0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
34000 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
34010 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
34020 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
34030 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
34040 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
34050 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
34060 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
34070 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
34080 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
34090 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
340a0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
340b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
340c0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50  .static int getP
340d0 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67  ageNormal(.  Pag
340e0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
340f0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
34100 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
34110 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
34120 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
34130 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
34140 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
34150 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
34160 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
34170 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
34180 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
34190 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
341a0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
341b0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
341c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
341d0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
341e0 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20    u8 noContent; 
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34200 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47    /* True if PAG
34210 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34220 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c   is set */.  sql
34230 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65  ite3_pcache_page
34240 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65   *pBase;..  asse
34250 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
34260 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
34270 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34280 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
34290 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
342a0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
342b0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
342c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
342d0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
342e0 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
342f0 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72   if( pgno==0 ) r
34300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
34310 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61  RUPT_BKPT;.  pBa
34320 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  se = sqlite3Pcac
34330 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34340 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33  pPCache, pgno, 3
34350 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d  );.  if( pBase==
34360 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  0 ){.    pPg = 0
34370 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
34380 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72  e3PcacheFetchStr
34390 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ess(pPager->pPCa
343a0 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73  che, pgno, &pBas
343b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
343c0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
343d0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
343e0 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73  rr;.    if( pBas
343f0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
34400 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
34410 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34420 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34430 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rr;.    }.  }.  
34440 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20  pPg = *ppPage = 
34450 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
34460 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d  chFinish(pPager-
34470 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34480 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74  pBase);.  assert
34490 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29  ( pPg==(*ppPage)
344a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
344b0 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  g->pgno==pgno );
344c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
344d0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c  pPager==pPager |
344e0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30  | pPg->pPager==0
344f0 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74   );..  noContent
34500 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
34510 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29  R_GET_NOCONTENT)
34520 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  !=0;.  if( pPg->
34530 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e  pPager && !noCon
34540 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  tent ){.    /* I
34550 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
34560 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63  pcache already c
34570 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69  ontains an initi
34580 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20  alized copy of. 
34590 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20     ** the page. 
345a0 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66  Return without f
345b0 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a  urther ado.  */.
345c0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
345d0 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  <=PAGER_MAX_PGNO
345e0 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f   && pgno!=PAGER_
345f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
34600 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
34610 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34620 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75  HIT]++;.    retu
34630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
34640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
34650 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
34660 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
34670 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
34680 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
34690 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
346a0 65 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f  ed. But first so
346b0 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a  me error checks:
346c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28  .    **.    ** (
346d0 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  1) The maximum p
346e0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
346f0 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65  31.    ** (2) Ne
34700 76 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68  ver try to fetch
34710 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67   the locking pag
34720 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
34730 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
34740 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  PGNO || pgno==PA
34750 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
34760 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
34770 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
34780 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
34790 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
347a0 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
347b0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
347c0 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72  ager;..    asser
347d0 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
347e0 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42  r->fd) || !MEMDB
347f0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
34800 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
34810 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
34820 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74  e<pgno || noCont
34830 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
34840 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
34850 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
34860 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
34870 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
34880 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
348a0 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
348b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
348c0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
348d0 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
348e0 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
348f0 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
34900 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
34910 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
34920 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
34930 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
34940 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
34950 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
34960 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
34970 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
34980 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
34990 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
349a0 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
349b0 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
349c0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
349d0 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
349e0 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
349f0 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
34a00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34a10 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
34a20 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
34a30 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
34a40 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
34a50 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
34a60 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
34a70 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
34a80 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
34a90 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
34aa0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
34ab0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
34ac0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
34ad0 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
34ae0 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
34af0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
34b00 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
34b10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34b20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34b30 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
34b40 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
34b50 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
34b60 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
34b70 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
34b80 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
34b90 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
34ba0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
34bb0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
34bc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
34bd0 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20  2 iFrame = 0;   
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34bf0 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20 66   Frame to read f
34c00 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  rom WAL file */.
34c10 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 55        if( pagerU
34c20 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
34c30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34c40 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34c50 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34c60 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
34c70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34c80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34c90 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34ca0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34cb0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34cc0 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
34cd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
34ce0 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34cf0 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
34d00 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
34d10 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
34d20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34d40 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34d50 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34d60 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
34d70 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
34d80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
34da0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
34db0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
34dc0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
34dd0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
34de0 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
34df0 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
34e00 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
34e10 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
34e20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
34e30 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
34e40 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
34e50 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
34e60 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
34e70 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
34e80 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
34e90 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
34ea0 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
34eb0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
34ec0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
34ed0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34ee0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
34ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
34f00 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
34f10 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
34f20 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
34f30 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
34f40 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
34f50 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
34f60 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
34f70 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
34f80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
34f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
34fa0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
34fb0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
34fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34fd0 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
34fe0 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
34ff0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
35000 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
35010 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
35020 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
35030 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
35040 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
35050 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
35060 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
35070 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
35080 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
35090 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
350a0 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
350b0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
350c0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
350d0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
350e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
350f0 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
35100 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
35110 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
35120 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35130 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
35140 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
35150 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
35160 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
35170 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
35180 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
35190 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
351a0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
351b0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
351c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
351d0 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
351e0 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
351f0 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
35200 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
35210 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
35220 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
35230 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
35240 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
35250 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
35260 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
35270 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
35280 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
35290 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
352a0 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
352b0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
352c0 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
352d0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
352e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
352f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
35300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
35310 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
35320 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
35330 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
35340 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
35350 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35360 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
35370 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
35380 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
35390 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
353a0 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
353b0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
353c0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
353d0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
353e0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
353f0 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
35400 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
35410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35420 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
35430 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
35450 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
35460 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
35470 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
35480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
35490 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
354a0 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
354b0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
354c0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
354d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
354e0 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
354f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35500 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
35510 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
35520 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
35530 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
35540 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
35550 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
35560 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
35570 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
35580 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
35590 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
355a0 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
355b0 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
355c0 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
355d0 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b  Pg);.     }else{
355e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
355f0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
35600 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
35610 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
35620 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
35630 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35640 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61  pPg ){.        a
35650 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
35660 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
35670 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
35680 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
35690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
356a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
356b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
356c0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
356d0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
356e0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
356f0 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e 6f  return getPageNo
35700 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67 6e  rmal(pPager, pgn
35710 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
35720 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
35730 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
35740 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68 65  IZE>0 */../* The
35750 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65 74   page getter met
35760 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68 65  hod for when the
35770 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72 72   pager is an err
35780 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61 74  or state */.stat
35790 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72  ic int getPageEr
357a0 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ror(.  Pager *pP
357b0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
357c0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
357d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
357e0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
357f0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
35800 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
35810 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
35820 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
35830 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
35840 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
35850 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
35860 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
35870 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
35880 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
35890 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b 0a  ARAMETER(pgno);.
358a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
358b0 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73 73  ER(flags);.  ass
358c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
358d0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
358e0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
358f0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
35900 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 0a  r->errCode;.}...
35910 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c 20  /* Dispatch all 
35920 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75 65  page fetch reque
35930 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72 6f  sts to the appro
35940 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d 65  priate getter me
35950 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  thod..*/.int sql
35960 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20 20  ite3PagerGet(.  
35970 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
35980 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
35990 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
359a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
359b0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
359c0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
359d0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
359e0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
359f0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
35a00 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
35a10 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
35a20 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
35a30 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58    /* PAGER_GET_X
35a40 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  XX flags */.){. 
35a50 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
35a60 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  xGet(pPager, pgn
35a70 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
35a80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
35a90 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
35aa0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
35ab0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
35ac0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
35ad0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
35ae0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
35af0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
35b00 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
35b10 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
35b20 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a  t in cache. .**.
35b30 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
35b40 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
35b50 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
35b60 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
35b70 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
35b80 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
35b90 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
35ba0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
35bb0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
35bc0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
35bd0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
35be0 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
35bf0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
35c00 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
35c10 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
35c20 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
35c30 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
35c40 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
35c50 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
35c60 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
35c70 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
35c80 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
35c90 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70  sqlite3_pcache_p
35ca0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
35cb0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
35cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
35cd0 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o!=0 );.  assert
35ce0 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  ( pPager->pPCach
35cf0 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20  e!=0 );.  pPage 
35d00 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
35d10 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
35d20 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a  ache, pgno, 0);.
35d30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 3d    assert( pPage=
35d40 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68 61  =0 || pPager->ha
35d50 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
35d60 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  );.  if( pPage==
35d70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
35d80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
35d90 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
35da0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
35db0 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d   pgno, pPage);.}
35dc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
35dd0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
35de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
35df0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
35e00 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
35e10 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
35e20 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
35e30 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
35e40 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
35e50 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
35e60 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
35e70 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
35e80 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
35e90 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
35ea0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
35eb0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
35ec0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
35ed0 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67  refNotNull(DbPag
35ee0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
35ef0 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65   *pPager;.  asse
35f00 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20  rt( pPg!=0 );.  
35f10 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
35f20 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
35f30 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
35f40 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MAP ){.    pager
35f50 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70  ReleaseMapPage(p
35f60 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
35f70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
35f80 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
35f90 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
35fa0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
35fb0 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  }.void sqlite3Pa
35fc0 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
35fd0 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
35fe0 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55   ) sqlite3PagerU
35ff0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29  nrefNotNull(pPg)
36000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
36010 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36020 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
36030 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74  of every write t
36040 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54  ransaction..** T
36050 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64  here must alread
36060 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20  y be a RESERVED 
36070 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
36080 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36090 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  e .** file when 
360a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
360b0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70  called..**.** Op
360c0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
360d0 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
360e0 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61  ager and write a
360f0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
36100 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ** to the start 
36110 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20  of it. If there 
36120 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
36130 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  oints, open the 
36140 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61  sub-journal.** a
36150 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  s well. This fun
36160 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
36170 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  ed when the jour
36180 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e  nal file is bein
36190 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20  g .** opened to 
361a0 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  write a rollback
361b0 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73   log for a trans
361c0 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f  action. It is no
361d0 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20  t used .** when 
361e0 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f  opening a hot jo
361f0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f  urnal file to ro
36200 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
36210 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
36220 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79   file is already
36230 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79   open (as it may
36240 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65   be in exclusive
36250 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20   mode),.** then 
36260 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75  this function ju
36270 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72  st writes a jour
36280 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
36290 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a  e start of the.*
362a0 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66  * already open f
362b0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ile. .**.** Whet
362c0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
362d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
362e0 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  pened by this fu
362f0 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50  nction, the.** P
36300 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
36310 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
36320 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a   is allocated..*
36330 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
36340 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
36350 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
36360 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  l. Otherwise, re
36370 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
36380 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74  NOMEM if the att
36390 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
363a0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
363b0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
363c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
363d0 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77   if opening or w
363e0 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  riting the journ
363f0 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a  al file fails..*
36400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
36410 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
36420 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
36430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36440 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
36450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36460 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
36470 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
36480 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
36490 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c  er->pVfs;   /* L
364a0 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66  ocal cache of vf
364b0 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  s pointer */..  
364c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
364d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
364e0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
364f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36500 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36510 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
36520 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
36530 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
36540 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
36550 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
36560 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
36570 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  s a no-op.  But 
36580 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65  on.  ** the othe
36590 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75  r hand, this rou
365a0 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
365b0 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61  lled if we are a
365c0 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61  lready in.  ** a
365d0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  n error state. *
365e0 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
365f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
36600 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
36610 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20  errCode;..  if( 
36620 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
36630 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
36640 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
36650 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
36660 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  FF ){.    pPager
36670 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
36680 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
36690 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
366a0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
366b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
366c0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
366d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
366e0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  KPT;.    }.  .  
366f0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
36700 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
36710 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36720 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  open. */.    if(
36730 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
36740 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  >jfd) ){.      i
36750 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
36760 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
36770 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
36780 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
36790 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
367a0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
367b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
367c0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
367d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
367e0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
367f0 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20  EN_CREATE;.     
36800 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a     int nSpill;..
36810 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
36820 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
36830 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
36840 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
36850 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
36860 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
36870 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
36880 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69     nSpill = sqli
36890 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53  te3Config.nStmtS
368a0 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65  pill;.        }e
368b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
368c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
368d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
368e0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69  ;.          nSpi
368f0 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53  ll = jrnlBufferS
36900 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
36910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36920 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72   .        /* Ver
36930 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
36940 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20  abase still has 
36950 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
36960 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20   it did when.   
36970 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f       ** it was o
36980 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
36990 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
369a0 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  = databaseIsUnmo
369b0 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ved(pPager);.   
369c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
369d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
369e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
369f0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20  JournalOpen (.  
36a00 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
36a10 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
36a20 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
36a30 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20   flags, nSpill. 
36a40 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
36a50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
36a60 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
36a70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
36a80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
36a90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
36aa0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
36ab0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
36ac0 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
36ad0 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
36ae0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
36af0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
36b00 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
36b10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
36b30 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
36b40 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
36b50 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
36b60 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
36b70 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
36b80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
36b90 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
36ba0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
36bb0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
36bc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
36bd0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
36be0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
36bf0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
36c00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
36c10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36c20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
36c30 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
36c40 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
36c50 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
36c60 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
36c70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
36c80 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
36c90 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
36ca0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
36cb0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
36cc0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
36cd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
36ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
36cf0 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
36d00 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
36d10 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
36d20 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
36d30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
36d40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
36d50 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
36d60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
36d70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
36d80 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
36d90 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
36da0 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
36db0 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
36dc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36dd0 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
36de0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
36df0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
36e00 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
36e10 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
36e20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
36e30 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
36e40 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
36e50 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
36e60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
36e70 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
36e80 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
36e90 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
36ea0 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
36eb0 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
36ec0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
36ed0 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
36ee0 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
36ef0 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
36f00 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
36f10 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
36f20 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
36f30 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
36f40 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
36f50 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
36f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
36f70 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
36f80 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
36f90 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
36fa0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
36fb0 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
36fc0 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
36fd0 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
36fe0 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
36ff0 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
37000 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
37010 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
37020 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
37030 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
37040 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
37050 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
37060 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
37070 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
37080 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
37090 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
370a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
370b0 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
370c0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
370d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
370e0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
370f0 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
37100 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
37110 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
37120 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
37130 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
37140 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
37150 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37160 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
37170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37180 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
37190 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
371a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
371b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
371c0 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
371d0 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
371e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
371f0 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
37200 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
37210 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
37220 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
37230 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
37240 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
37250 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
37260 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
37270 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
37280 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
37290 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
372a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
372b0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
372c0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
372d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
372e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
372f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
37300 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
37310 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
37320 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
37330 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
37340 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  l, 1);.      }..
37350 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68        /* Grab th
37360 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
37370 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66  the log file. If
37380 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67   successful, upg
37390 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rade to.      **
373a0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
373b0 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
373c0 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
373d0 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
373e0 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ller..      ** T
373f0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
37400 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69  is not invoked i
37410 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63  f another connec
37420 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20  tion already.   
37430 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20     ** holds the 
37440 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70  write-lock. If p
37450 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70  ossible, the upp
37460 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61  er layer will ca
37470 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  ll it..      */.
37480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
37490 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54  e3WalBeginWriteT
374a0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
374b0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65  r->pWal);.    }e
374c0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62  lse{.      /* Ob
374d0 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
374e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
374f0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
37500 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74  e exFlag paramet
37510 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  er.      ** is t
37520 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69  rue, then immedi
37530 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68  ately upgrade th
37540 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  is to an EXCLUSI
37550 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
37560 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c     ** busy-handl
37570 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20  er callback can 
37580 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67  be used when upg
37590 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58  rading to the EX
375a0 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a  CLUSIVE.      **
375b0 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77   lock, but not w
375c0 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68  hen obtaining th
375d0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  e RESERVED lock.
375e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
375f0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
37600 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
37610 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
37620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37630 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   && exFlag ){.  
37640 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37650 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
37660 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
37670 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
37680 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
37690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
376a0 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74       /* Change t
376b0 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  o WRITER_LOCKED 
376c0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
376d0 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
376e0 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74  e sets Pager.eSt
376f0 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49  ate to PAGER_WRI
37700 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41  TER_LOCKED or CA
37710 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20  CHEMOD.      ** 
37720 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f  when it has an o
37730 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  pen transaction,
37740 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42   but never to DB
37750 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e  MOD or FINISHED.
37760 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69  .      ** This i
37770 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f  s because in tho
37780 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f  se states the co
37790 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  de to roll back 
377a0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
377b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
377c0 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66   may copy data f
377d0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
377e0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nal into the dat
377f0 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  abase .      ** 
37800 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20  file as well as 
37810 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  into the page ca
37820 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64  che. Which would
37830 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e   be incorrect in
37840 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d   .      ** WAL m
37850 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ode..      */.  
37860 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
37870 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
37880 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  R_LOCKED;.      
37890 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
378a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
378b0 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
378c0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
378d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
378e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
378f0 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
37900 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
37910 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
37920 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  Off = 0;.    }..
37930 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
37940 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
37950 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37960 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
37970 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
37980 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
37990 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
379a0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
379b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73  .    assert( ass
379c0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
379d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a  pPager) );.  }..
379e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
379f0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
37a00 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
37a10 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
37a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
37a30 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74   page pPg onto t
37a40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f  he end of the ro
37a50 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
37a60 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
37a70 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61  _NOINLINE int pa
37a80 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c  gerAddPageToRoll
37a90 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64  backJournal(PgHd
37aa0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
37ab0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
37ac0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
37ad0 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20  ;.  u32 cksum;. 
37ae0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
37af0 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67   i64 iOff = pPag
37b00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
37b10 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20  .  /* We should 
37b20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
37b30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37b40 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
37b50 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37b60 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
37b70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
37b80 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
37b90 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
37ba0 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ot. */.  assert(
37bb0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
37bc0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
37bd0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
37be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
37bf0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
37c00 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45  nalOff );.  CODE
37c10 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C2(pPager, pPg->
37c20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
37c30 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 7, return SQLI
37c40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70  TE_NOMEM_BKPT, p
37c50 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20  Data2);.  cksum 
37c60 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
37c70 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
37c80 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69  2);..  /* Even i
37c90 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66  f an IO or diskf
37ca0 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ull error occurs
37cb0 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
37cc0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  ng the.  ** page
37cd0 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
37ce0 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
37cf0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
37d00 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f  the page..  ** O
37d10 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
37d20 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
37d30 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
37d40 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a  he logic in.  **
37d50 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
37d60 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
37d70 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
37d80 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
37d90 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 64  ed.  ** in the d
37da0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
37db0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
37dc0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
37dd0 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65  ing so,.  ** the
37de0 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79  n corruption may
37df0 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20   follow..  */.  
37e00 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
37e10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a  HDR_NEED_SYNC;..
37e20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
37e30 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
37e40 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  iOff, pPg->pgno)
37e50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
37e60 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
37e70 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
37e80 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
37e90 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
37ea0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
37eb0 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72  iOff+4);.  if( r
37ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
37ed0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
37ee0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
37ef0 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
37f00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
37f10 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  4, cksum);.  if(
37f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49   return rc;..  I
37f40 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
37f50 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
37f60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
37f70 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  o, .           p
37f80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37f90 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
37fa0 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f 49  ize));.  PAGER_I
37fb0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
37fc0 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
37fd0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
37fe0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
37ff0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
38000 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
38010 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
38020 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
38030 20 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e   .       ((pPg->
38040 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
38050 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
38060 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
38070 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ));..  pPager->j
38080 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
38090 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
380a0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  e;.  pPager->nRe
380b0 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  c++;.  assert( p
380c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
380d0 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  l!=0 );.  rc = s
380e0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
380f0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
38100 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
38110 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
38120 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
38130 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
38140 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
38150 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
38160 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
38170 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
38180 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
38190 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
381a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
381b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
381c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
381d0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
381e0 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
381f0 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
38200 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
38210 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
38220 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
38230 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
38240 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
38250 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
38260 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
38270 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
38280 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
38290 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
382a0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
382b0 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
382c0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
382d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
382e0 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
382f0 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
38300 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
38310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
38320 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
38330 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
38340 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
38350 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
38360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
38370 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
38380 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c  s not called unl
38390 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ess a write-tran
383a0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
383b0 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73  ady .  ** been s
383c0 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72  tarted. The jour
383d0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20  nal file may or 
383e0 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20  may not be open 
383f0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20  at this point.. 
38400 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20   ** It is never 
38410 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52  called in the ER
38420 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a  ROR state..  */.
38430 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38440 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
38450 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20  WRITER_LOCKED.  
38460 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
38470 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
38480 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
38490 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
384a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
384b0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
384c0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
384d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
384e0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
384f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
38500 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
38510 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
38520 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b  ly==0 );.  CHECK
38530 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
38540 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
38550 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6f  le needs to be o
38560 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c 65  pened. Higher le
38570 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61 76  vel routines hav
38580 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f  e already.  ** o
38590 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63 65  btained the nece
385a0 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62  ssary locks to b
385b0 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d 74  egin the write-t
385c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
385d0 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  the.  ** rollbac
385e0 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  k journal might 
385f0 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e  not yet be open.
38600 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66 20   Open it now if 
38610 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
38620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ..  **.  ** This
38630 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
38640 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50  calling sqlite3P
38650 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29  cacheMakeDirty()
38660 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 20   on the page. . 
38670 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
38680 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20 61  f it were done a
38690 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c  fter calling sql
386a0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
386b0 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a  rty(), then.  **
386c0 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74 20   an error might 
386d0 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70 61  occur and the pa
386e0 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75 70  ger would end up
386f0 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   in WRITER_LOCKE
38700 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69 74  D state.  ** wit
38710 68 20 70 61 67 65