/ Hex Artifact Content
Login

Artifact 2d950142528e5d9b291a1160443d7ade0d90700d:


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 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
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 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9cf0: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9d00: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9d10: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9d20: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9d30: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9d40: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9d50: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9d60: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9d70: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9d80: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9d90: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9da0: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9db0: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9dc0: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9dd0: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9de0: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9df0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9e00: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9e10: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9e20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9e40: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9e50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9e60: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9e70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9e80: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
9e90: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
9ea0: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
9eb0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
9ec0: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
9ed0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
9ee0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9ef0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f00: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
9f20: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
9f30: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
9f40: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
9f50: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
9f60: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9f70: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
9f80: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f90: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9fa0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9fb0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9fc0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
9fd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9fe0: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
9ff0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a000: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a010: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a020: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a030: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a040: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a050: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a060: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a070: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a080: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a090: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a0a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a0b0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a0c0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a0d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a0e0: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a0f0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a110: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a120: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a130: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a140: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a150: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a160: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a180: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a190: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a1a0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a1b0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a1c0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a1d0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a1e0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a1f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a200: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a210: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a220: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a230: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a240: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a250: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a260: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a270: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a280: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a2a0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a2b0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a2c0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a2d0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a2e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a2f0: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a300: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a310: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a320: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a330: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
a370: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a380: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a390: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a3a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a3b0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a3c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a3f0: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a410: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a420: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a430: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a440: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a450: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a460: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a470: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a480: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a490: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a4a0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a4b0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a4c0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a4d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a4e0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a4f0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a500: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a510: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a530: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a540: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a550: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a560: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a570: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a580: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a590: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a5a0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a5b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a5c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a5d0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a5e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a5f0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a600: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a620: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a630: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a640: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a650: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a660: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a670: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a680: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a690: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a6a0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a6b0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a6c0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a6d0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a6e0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a6f0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a700: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a710: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a720: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a730: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a740: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a750: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a760: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a770: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a780: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a790: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a7a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a7b0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a7c0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a7d0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a7e0: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a7f0: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a800: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a810: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a820: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a840: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a850: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a860: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a870: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a880: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a8a0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a8b0: 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
a8c0: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
a8d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
a8e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a8f0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a900: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a910: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a920: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a930: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a940: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a950: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a960: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a970: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a980: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a990: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a9a0: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a9b0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a9c0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a9d0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a9e0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a9f0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aa00: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
aa10: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
aa20: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
aa30: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
aa40: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
aa50: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
aa60: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
aa70: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
aa80: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
aa90: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
aaa0: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
aab0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
aac0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
aad0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
aae0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
aaf0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
ab00: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
ab10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
ab20: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
ab30: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
ab40: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
ab50: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
ab60: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
ab70: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
ab80: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
ab90: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
aba0: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
abb0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
abc0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
abd0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
abe0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
abf0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
ac00: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
ac10: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
ac20: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ac30: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
ac40: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
ac50: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
ac60: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
ac70: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
ac80: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
ac90: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
aca0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
acb0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
acc0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
acd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ace0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
acf0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
ad00: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
ad10: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
ad20: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
ad30: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
ad40: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
ad50: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ad60: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
ad70: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
ad80: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
ad90: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
ada0: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
adb0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
adc0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
add0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
ade0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
adf0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
ae00: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ae10: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ae20: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
ae30: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
ae50: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
ae60: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
ae70: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
ae80: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
ae90: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
aea0: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
aeb0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
aec0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
aee0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aef0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
af00: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
af10: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af20: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
af30: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
af40: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
af50: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
af60: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
af70: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
af80: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
af90: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
afa0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
afb0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
afc0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
afd0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
afe0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
aff0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
b000: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
b010: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b020: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b030: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
b040: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
b050: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
b060: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
b070: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
b080: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
b090: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
b0a0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
b0b0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
b0c0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
b0d0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
b0e0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
b0f0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
b100: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
b110: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
b120: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b130: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b140: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b150: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b160: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b170: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b180: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b190: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b1a0: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b1b0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b1c0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b1d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b1e0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b1f0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b200: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b210: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b220: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b230: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b240: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b250: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b260: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b270: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b280: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b290: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b2a0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b2b0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b2c0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b2d0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b2e0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b2f0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b300: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b310: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b320: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b330: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b340: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b350: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
b360: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
b370: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
b380: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
b390: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
b3a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
b3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
b3c0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b3d0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
b3e0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
b3f0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
b400: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
b410: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
b420: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
b430: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b440: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
b450: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
b460: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
b470: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
b480: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
b490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
b4a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
b4b0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
b4c0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
b4d0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
b4e0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
b4f0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
b500: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
b510: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
b520: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
b530: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b540: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b550: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
b560: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
b570: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
b580: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
b590: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
b5a0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b5b0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
b5c0: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
b5d0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
b5e0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
b5f0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
b600: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
b610: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
b620: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
b630: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
b640: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
b650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b660: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
b670: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
b680: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
b690: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
b6a0: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
b6b0: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
b6c0: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
b6d0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
b6e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
b6f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
b700: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
b710: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b720: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
b730: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
b740: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
b750: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b760: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
b770: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
b780: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b790: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b7a0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
b7b0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
b7c0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
b7d0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
b7e0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
b7f0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
b800: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
b810: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
b820: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
b830: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
b840: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
b850: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
b860: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
b870: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
b880: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
b890: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
b8a0: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
b8b0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
b8c0: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
b8d0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
b8e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
b8f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
b900: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
b910: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b920: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
b930: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
b940: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
b950: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b960: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
b970: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
b980: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
b990: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b9a0: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
b9b0: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
b9c0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
b9d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b9e0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
b9f0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
ba00: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
ba10: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
ba20: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
ba30: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
ba40: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
ba70: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
ba80: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
ba90: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
baa0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bab0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
bac0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
bad0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
bae0: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
baf0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
bb00: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
bb10: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
bb20: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
bb30: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
bb40: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
bb50: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
bb60: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
bb70: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bb80: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bb90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
bba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
bbb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
bbc0: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
bbd0: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
bbe0: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
bbf0: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
bc00: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
bc10: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
bc20: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
bc30: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
bc40: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
bc50: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
bc60: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
bc70: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
bc80: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
bc90: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
bca0: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
bcb0: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
bcc0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
bcd0: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
bce0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
bcf0: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
bd00: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
bd10: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
bd20: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
bd30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
bd40: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
bd50: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
bd60: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
bd70: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
bd80: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
bd90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
bda0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
bdb0: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
bdc0: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
bdd0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
bde0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
bdf0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
be00: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
be10: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
be20: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
be30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
be40: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
be50: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
be60: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
be70: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
be80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
be90: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
bea0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
beb0: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
bec0: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
bed0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
bee0: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
bef0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
bf00: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
bf10: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
bf20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bf30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
bf40: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
bf50: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
bf60: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
bf70: 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
bf80: 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  on.** can be use
bf90: 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  d with this page
bfa0: 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74  r. The optimizat
bfb0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
bfc0: 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74  if:.**.**  (a) t
bfd0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bfe0: 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61  d by OsDeviceCha
bff0: 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69  racteristics() i
c000: 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a  ndicates that.**
c010: 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65        a database
c020: 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69   page may be wri
c030: 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c  tten atomically,
c040: 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65   and.**  (b) the
c050: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
c060: 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  by OsSectorSize(
c070: 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  ) is less than o
c080: 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20  r equal.**      
c090: 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
c0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69  ..**.** The opti
c0b0: 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f  mization is also
c0c0: 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20   always enabled 
c0d0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c0e0: 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e  les. It is.** an
c0f0: 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74   error to call t
c100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20  his function if 
c110: 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64  pPager is opened
c120: 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   on an in-memory
c130: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  .** database..**
c140: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d  .** If the optim
c150: 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ization cannot b
c160: 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74  e used, 0 is ret
c170: 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e  urned. If it can
c180: 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65   be used,.** the
c190: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
c1a0: 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65  rned is the size
c1b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c1c0: 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20  file when it.** 
c1d0: 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63  contains rollbac
c1e0: 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74  k data for exact
c1f0: 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a  ly one page..*/.
c200: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c210: 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
c220: 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  E.static int jrn
c230: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c240: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c250: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c260: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
c270: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
c280: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
c2b0: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
c2c0: 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20    int nSector;  
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c2f0: 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ze */.    int sz
c300: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
c310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c320: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20  age size */..   
c330: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
c340: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
c350: 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f     dc = sqlite3O
c360: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
c370: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
c380: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
c390: 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  = pPager->sector
c3a0: 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65  Size;.    szPage
c3b0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
c3c0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
c3d0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c3e0: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
c3f0: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
c400: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c410: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
c420: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
c430: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
c440: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
c450: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
c460: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
c470: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
c480: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
c490: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
c4a0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
c4b0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d  PG_SZ(pPager);.}
c4c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
c4d0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4e0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
c4f0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
c500: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
c510: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
c520: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
c530: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
c540: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
c550: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
c560: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
c570: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c580: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
c590: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
c5a0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
c5b0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
c5c0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
c5d0: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
c5e0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
c5f0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
c600: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
c610: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
c620: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
c630: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
c640: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
c650: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
c660: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
c670: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c680: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c690: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
c6a0: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
c6b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
c6c0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
c6d0: 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a  )pPage->pData);.
c6e0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  }.static void pa
c6f0: 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
c700: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
c710: 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73    pPage->pageHas
c720: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
c730: 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  sh(pPage);.}../*
c740: 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41  .** The CHECK_PA
c750: 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61  GE macro takes a
c760: 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72   PgHdr* as an ar
c770: 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54  gument. If SQLIT
c780: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a  E_CHECK_PAGES.**
c790: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64   is defined, and
c7a0: 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64   NDEBUG is not d
c7b0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
c7c0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68  t() statement ch
c7d0: 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  ecks.** that the
c7e0: 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20   page is either 
c7f0: 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d  dirty or still m
c800: 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75  atches the calcu
c810: 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e  lated page-hash.
c820: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43  .*/.#define CHEC
c830: 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50  K_PAGE(x) checkP
c840: 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f  age(x).static vo
c850: 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48  id checkPage(PgH
c860: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
c870: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
c880: 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  >pPager;.  asser
c890: 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
c8a0: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
c8b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67  ;.  assert( (pPg
c8c0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
c8d0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
c8e0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
c8f0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
c900: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
c910: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
c920: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
c930: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
c940: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
c950: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29  _set_pagehash(X)
c960: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c970: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
c980: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
c990: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
c9a0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
c9b0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
c9c0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
c9d0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
c9e0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
c9f0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
ca00: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
ca10: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ca20: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
ca30: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
ca40: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
ca50: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
ca60: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
ca70: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
ca80: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
ca90: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
caa0: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
cab0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
cac0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
cad0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cae0: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
caf0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
cb00: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
cb10: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
cb20: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
cb30: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
cb40: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
cb50: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
cb60: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
cb70: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
cb80: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
cb90: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
cba0: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
cbb0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
cbc0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
cbd0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cbe0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
cbf0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
cc00: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
cc10: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
cc20: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
cc30: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
cc40: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
cc50: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
cc60: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
cc70: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
cc80: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
cc90: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
cca0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
ccb0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
ccc0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
ccd0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
cce0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
ccf0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
cd00: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
cd10: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
cd20: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
cd30: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
cd40: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
cd50: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
cd60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
cd70: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
cd80: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
cd90: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
cda0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
cdb0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
cdc0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
cdd0: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
cde0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
cdf0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ce00: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
ce10: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
ce20: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
ce30: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
ce40: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
ce50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ce60: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
ce70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
ce80: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
ce90: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
cea0: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cec0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
ced0: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cef0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
cf00: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
cf10: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
cf20: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
cf30: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
cf40: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
cf50: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
cf60: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
cf70: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
cf80: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
cf90: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
cfa0: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
cfb0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
cfd0: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
cfe0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
cff0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
d000: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
d010: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
d020: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
d030: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
d040: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
d050: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d060: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
d070: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
d080: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
d090: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
d0a0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
d0b0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
d0c0: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
d0d0: 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20  r .   || len==0 
d0e0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d0f0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
d100: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
d110: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
d120: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
d130: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
d140: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
d150: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
d160: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
d170: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
d180: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
d190: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
d1a0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
d1b0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
d1c0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
d1d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d1e0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
d1f0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
d200: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
d210: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
d220: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
d230: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
d240: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
d250: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
d260: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
d270: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
d280: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
d290: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
d2a0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
d2b0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
d2c0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d2d0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
d2e0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
d2f0: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
d300: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
d310: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d320: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
d330: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
d340: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
d350: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
d360: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
d370: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
d380: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
d390: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d3a0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
d3b0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
d3c0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
d3d0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
d3e0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d3f0: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d400: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d410: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d420: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d430: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d440: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d450: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d460: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d470: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d480: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d490: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d4a0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d4d0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d4f0: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d510: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d560: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d570: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d580: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d590: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d5a0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
d5b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
d5c0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
d5d0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
d5e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5f0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
d600: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d610: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d620: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
d640: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d650: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
d660: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
d670: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d680: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
d690: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
d6a0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
d6b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
d6c0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
d6d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
d6e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d6f0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
d700: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d710: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
d720: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
d730: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
d740: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
d750: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
d760: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
d770: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
d780: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
d790: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
d7a0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
d7b0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
d7c0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
d7d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d7e0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
d7f0: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
d800: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
d810: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
d820: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
d830: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d840: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
d850: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
d860: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
d870: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
d880: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d890: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
d8a0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
d8b0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
d8c0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
d8d0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d8e0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
d8f0: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
d900: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
d910: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
d920: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
d930: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
d940: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d950: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
d960: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
d970: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
d980: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
d990: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
d9a0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
d9b0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d9c0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
d9d0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
d9e0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
d9f0: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
da00: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
da10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
da20: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
da30: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
da40: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
da50: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
da60: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
da70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
da80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
da90: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
daa0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
dab0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
dac0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
dad0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daf0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
db00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
db10: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
db20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
db30: 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
db40: 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
db50: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
db60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
db70: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
db80: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
db90: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
dba0: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
dbb0: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
dbc0: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
dbd0: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
dbe0: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
dbf0: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
dc00: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
dc10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dc20: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
dc30: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
dc40: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
dc50: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
dc60: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
dc70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dc80: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
dc90: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
dca0: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
dcb0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
dcc0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dcd0: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
dce0: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
dcf0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
dd00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
dd10: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
dd20: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  Y|pPager->syncFl
dd30: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
dd40: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
dd50: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
dd60: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
dd70: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
dd80: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
dd90: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
dda0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
ddb0: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
ddc0: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
ddd0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
dde0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
ddf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
de00: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
de10: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
de20: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
de30: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
de40: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
de50: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
de60: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
de70: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
de80: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
de90: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
dea0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
deb0: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
dec0: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
ded0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
dee0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
def0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
df00: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
df10: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
df20: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
df30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
df40: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
df50: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
df60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
df70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
df80: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
df90: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
dfa0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
dfb0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
dfc0: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
dfd0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
dfe0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
dff0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
e000: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
e010: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
e020: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
e030: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
e040: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e050: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
e060: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
e070: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
e080: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
e090: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
e0a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
e0b0: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
e0c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
e0d0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
e0e0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
e0f0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
e100: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
e110: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
e120: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
e130: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
e140: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
e150: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
e160: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
e170: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
e180: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
e190: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
e1a0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
e1b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e1c0: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
e1d0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
e1e0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
e1f0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
e200: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
e210: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e230: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e240: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
e250: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
e260: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
e270: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
e280: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
e290: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
e2a0: 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
e2b0: 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66  eSize;/* Size of
e2c0: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
e2d0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
e2e0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e310: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
e320: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
e330: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
e360: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
e370: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e380: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
e390: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
e3a0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
e3b0: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
e3c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
e3d0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
e3e0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
e3f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
e400: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
e410: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
e420: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
e430: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
e440: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
e450: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
e460: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
e470: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
e480: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
e490: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
e4a0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
e4b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
e4c0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
e4d0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
e4e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e4f0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
e500: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
e510: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
e520: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e530: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
e540: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
e550: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e560: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
e570: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e580: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
e590: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
e5a0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
e5b0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
e5c0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
e5d0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
e5e0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
e5f0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
e600: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
e610: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
e620: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
e630: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
e640: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
e650: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
e660: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
e670: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
e680: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
e690: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
e6a0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
e6b0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
e6c0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
e6d0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
e6e0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
e6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
e700: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
e710: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
e720: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
e730: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
e740: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
e750: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
e760: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
e770: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
e780: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
e790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e7a0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
e7b0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
e7c0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
e7d0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
e7e0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
e7f0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
e800: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
e810: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e820: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
e830: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
e840: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
e850: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
e860: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
e870: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
e880: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
e890: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
e8a0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
e8b0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
e8c0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
e8d0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
e8e0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
e8f0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
e900: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
e910: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
e920: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
e930: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
e940: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
e950: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
e960: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
e970: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e980: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
e990: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e9a0: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
e9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
e9c0: 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
e9d0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
e9e0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
e9f0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
ea00: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
ea10: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
ea20: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
ea30: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
ea40: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
ea50: 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
ea60: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
ea70: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
ea80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
ea90: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
eaa0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
eab0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
eac0: 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d  0xffffffff);.  }
ead0: 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74  else{.    memset
eae0: 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a  (zHeader, 0, siz
eaf0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb00: 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  c)+4);.  }..  /*
eb10: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
eb20: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a  k-hash initializ
eb30: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
eb40: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
eb50: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
eb60: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
eb70: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
eb80: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
eb90: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
eba0: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
ebb0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
ebc0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
ebd0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
ebe0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ebf0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ec00: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
ec10: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
ec20: 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73  ze);.  /* The as
ec30: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
ec40: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
ec50: 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ss */.  put32bit
ec60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ec70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec80: 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65  +12], pPager->se
ec90: 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a  ctorSize);..  /*
eca0: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a   The page size *
ecb0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
ecc0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ecd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
ece0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
ecf0: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ze);..  /* Initi
ed00: 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c  alizing the tail
ed10: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
ed20: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
ed30: 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a    Everything.  *
ed40: 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20  * works find if 
ed50: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65  the following me
ed60: 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65  mset() is omitte
ed70: 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69  d.  But initiali
ed80: 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65  zing.  ** the me
ed90: 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61  mory prevents va
eda0: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70  lgrind from comp
edb0: 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61  laining, so we a
edc0: 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20  re willing to.  
edd0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66  ** take the perf
ede0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a  ormance hit..  *
edf0: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61  /.  memset(&zHea
ee00: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
ee10: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30  nalMagic)+20], 0
ee20: 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64  ,.         nHead
ee30: 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72  er-(sizeof(aJour
ee40: 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a  nalMagic)+20));.
ee50: 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c  .  /* In theory,
ee60: 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65   it is only nece
ee70: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
ee80: 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74  he 28 bytes that
ee90: 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e   the .  ** journ
eea0: 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d  al header consum
eeb0: 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  es to the journa
eec0: 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65  l file here. The
eed0: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  n increment the 
eee0: 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72  .  ** Pager.jour
eef0: 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20  nalOff variable 
ef00: 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  by JOURNAL_HDR_S
ef10: 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  Z so that the ne
ef20: 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20  xt .  ** record 
ef30: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ef40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74  e following sect
ef50: 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61  or (leaving a ga
ef60: 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  p in the file.  
ef70: 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ** that will be 
ef80: 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65  implicitly fille
ef90: 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e  d in by the OS).
efa0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76  .  **.  ** Howev
efb0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  er it has been d
efc0: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f  iscovered that o
efd0: 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74  n some systems t
efe0: 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20  his pattern can 
eff0: 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69  .  ** be signifi
f000: 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68  cantly slower th
f010: 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20  an contiguously 
f020: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f030: 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65  the file,.  ** e
f040: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
f050: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69  s explicitly wri
f060: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
f070: 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20   block of .  ** 
f080: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
f090: 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74  - 28) bytes that
f0a0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
f0b0: 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68  d. So that is wh
f0c0: 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e  at.  ** is done.
f0d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20   .  **.  ** The 
f0e0: 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64  loop is required
f0f0: 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68   here in case th
f100: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73  e sector-size is
f110: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
f120: 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20   .  ** database 
f130: 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65  page size. Since
f140: 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66   the zHeader buf
f150: 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65  fer is only Page
f160: 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20  r.pageSize.  ** 
f170: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d  bytes in size, m
f180: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c  ore than one cal
f190: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72  l to sqlite3OsWr
f1a0: 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71  ite() may be req
f1b0: 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f  uired.  ** to po
f1c0: 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72  pulate the entir
f1d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
f1e0: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20   sector..  */ . 
f1f0: 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72   for(nWrite=0; r
f200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57  c==SQLITE_OK&&nW
f210: 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  rite<JOURNAL_HDR
f220: 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72  _SZ(pPager); nWr
f230: 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20  ite+=nHeader){. 
f240: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
f250: 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
f260: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
f270: 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65  >journalHdr, nHe
f280: 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20  ader)).    rc = 
f290: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
f2a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
f2b0: 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50  der, nHeader, pP
f2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
f2e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f2f0: 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  r <= pPager->jou
f300: 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70  rnalOff );.    p
f310: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f320: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
f330: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
f340: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
f350: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
f360: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
f370: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
f380: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f390: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
f3a0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
f3b0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
f3c0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f3d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
f3e0: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
f3f0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
f400: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
f410: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
f420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f430: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
f440: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
f450: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
f460: 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70  for.** a descrip
f470: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
f480: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
f490: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
f4a0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
f4b0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e  uccessfully, *pN
f4c0: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
f4d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
f4e0: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
f4f0: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
f500: 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69  r and *pDbSize i
f510: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
f520: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
f530: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
f540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
f550: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
f560: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
f570: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
f580: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
f590: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
f5a0: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
f5b0: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
f5c0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
f5d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
f5e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
f5f0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
f600: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
f610: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
f620: 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63  urned and *pNRec
f630: 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72   and *PDbSize ar
f640: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66  e undefined.  If
f650: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f660: 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20  bytes.** cannot 
f670: 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
f680: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
f690: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
f6a0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
f6b0: 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e  ic int readJourn
f6c0: 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a  alHdr(.  Pager *
f6d0: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
f6e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
f6f0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
f700: 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72  sHot,.  i64 jour
f710: 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20  nalSize,        
f720: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f730: 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c  the open journal
f740: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
f750: 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  /.  u32 *pNRec, 
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72   /* OUT: Value r
f780: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65  ead from the nRe
f790: 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32  c field */.  u32
f7a0: 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20   *pDbSize       
f7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f7c0: 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69  : Value of origi
f7d0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  nal database siz
f7e0: 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  e field */.){.  
f7f0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f810: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
f820: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
f830: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a  Magic[8];     /*
f840: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
f850: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
f860: 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
f870: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
f880: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
f890: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f8a0: 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a   being read */..
f8b0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
f8c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
f8d0: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
f8e0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
f8f0: 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76  en. */..  /* Adv
f900: 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ance Pager.journ
f910: 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61  alOff to the sta
f920: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73  rt of the next s
f930: 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20  ector. If the.  
f940: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
f950: 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72  is too small for
f960: 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68   there to be a h
f970: 65 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20  eader stored at 
f980: 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c  this.  ** point,
f990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f9a0: 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ONE..  */.  pPag
f9b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
f9c0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
f9d0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
f9e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f9f0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
fa00: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
fa10: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
fa20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
fa30: 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  NE;.  }.  iHdrOf
fa40: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
fa50: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65  nalOff;..  /* Re
fa60: 61 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  ad in the first 
fa70: 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
fa80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49  ournal header. I
fa90: 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61  f they do not ma
faa0: 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61  tch.  ** the  ma
fab0: 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64  gic string found
fac0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
fad0: 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65   each journal he
fae0: 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a  ader, return.  *
faf0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49  * SQLITE_DONE. I
fb00: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
fb10: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
fb20: 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
fb30: 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63  rwise,.  ** proc
fb40: 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eed..  */.  if( 
fb50: 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66  isHot || iHdrOff
fb60: 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
fb70: 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  lHdr ){.    rc =
fb80: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
fb90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
fba0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
fbb0: 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20  c), iHdrOff);.  
fbc0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fbd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fbe0: 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d   }.    if( memcm
fbf0: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
fc00: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
fc10: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
fc20: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fc30: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
fc40: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
fc50: 65 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32  e first three 32
fc60: 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74  -bit fields of t
fc70: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fc80: 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a  r: The nRec.  **
fc90: 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63   field, the chec
fca0: 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72  ksum-initializer
fcb0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
fcc0: 65 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74  e size at the st
fcd0: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
fce0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74  transaction. Ret
fcf0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
fd00: 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
fd10: 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20  es wrong..  */. 
fd20: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
fd30: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd50: 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29  drOff+8, pNRec))
fd60: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
fd70: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fd80: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fd90: 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61  iHdrOff+12, &pPa
fda0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29  ger->cksumInit))
fdb0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
fdc0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fdd0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fde0: 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53  iHdrOff+16, pDbS
fdf0: 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ize)).  ){.    r
fe00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
fe10: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
fe20: 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
fe30: 20 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b    u32 iPageSize;
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe50: 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  * Page-size fiel
fe60: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fe70: 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  der */.    u32 i
fe80: 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  SectorSize;     
fe90: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
fea0: 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  r-size field of 
feb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
fec0: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
fed0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fee0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
fef0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
ff00: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
ff10: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
ff20: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
ff30: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
ff40: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
ff50: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
ff60: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
ff70: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
ff80: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
ff90: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
ffa0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ffb0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
ffc0: 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53  /* Versions of S
ffd0: 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33  QLite prior to 3
ffe0: 2e 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67  .5.8 set the pag
fff0: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e-size field of 
10000 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
10010 61 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72  al header to zer
10020 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  o. In this case,
10030 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
10040 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
10050 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20      ** variable 
10060 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74  is already set t
10070 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  o the correct pa
10080 67 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  ge size..    */.
10090 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
100a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50  e==0 ){.      iP
100b0 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
100c0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
100d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
100e0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
100f0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
10100 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
10110 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20  or-size fields. 
10120 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e     ** are within
10130 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69   range. To be 'i
10140 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76  n range', both v
10150 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65  alues need to be
10160 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20   a power.    ** 
10170 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
10180 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
10190 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e  512 or 32, and n
101a0 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ot greater than 
101b0 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65  their .    ** re
101c0 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65  spective compile
101d0 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69   time maximum li
101e0 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  mits..    */.   
101f0 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35   if( iPageSize<5
10200 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
10210 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69      || iSectorSi
10220 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50  ze<32.     || iP
10230 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10240 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20  AX_PAGE_SIZE || 
10250 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f  iSectorSize>MAX_
10260 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20  SECTOR_SIZE.    
10270 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d   || ((iPageSize-
10280 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30  1)&iPageSize)!=0
10290 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53     || ((iSectorS
102a0 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69  ize-1)&iSectorSi
102b0 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
102c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65       /* If the e
102d0 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73  ither the page-s
102e0 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69  ize or sector-si
102f0 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ze in the journa
10300 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20  l-header is .   
10310 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74     ** invalid, t
10320 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
10330 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a  that wrote the j
10340 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75  ournal-header mu
10350 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a  st have .      *
10360 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65  * crashed before
10370 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20   the header was 
10380 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20  synced. In this 
10390 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e  case stop readin
103a0 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  g .      ** the 
103b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72  journal file her
103c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
103d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
103e0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
103f0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70   /* Update the p
10400 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  age-size to matc
10410 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  h the value read
10420 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
10430 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61  l. .    ** Use a
10440 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
10450 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  o to make sure t
10460 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  hat malloc failu
10470 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a  re within .    *
10480 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  * PagerSetPagesi
10490 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a  ze() is tested..
104a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
104b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
104c0 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
104d0 26 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b  &iPageSize, -1);
104e0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
104f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
10500 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
10510 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
10520 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
10530 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
10540 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
10550 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
10560 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
10570 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
10580 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
10590 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
105a0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
105b0 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
105c0 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
105d0 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
105e0 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
105f0 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
10600 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
10610 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
10620 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
10630 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
10640 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
10650 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
10660 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
10670 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
10680 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
10690 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
106a0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
106b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
106c0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
106d0 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
106e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
106f0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
10700 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
10710 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
10720 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
10730 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
10740 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
10750 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
10760 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
10770 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10780 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
10790 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
107a0 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
107b0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
107c0 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
107d0 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
107e0 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
107f0 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
10800 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
10810 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
10820 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
10830 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
10840 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
10850 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
10860 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
10870 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
10880 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
10890 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
108a0 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
108b0 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
108c0 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
108d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
108e0 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
108f0 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
10900 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
10910 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10920 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
10930 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
10940 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
10950 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
10960 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
10970 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
10980 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
10990 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
109a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
109b0 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
109c0 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
109d0 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
109e0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
109f0 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
10a00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10a10 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
10a20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
10a30 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10a40 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10a50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10a80 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
10a90 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
10aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
10ab0 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
10ac0 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
10ad0 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
10ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
10af0 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
10b00 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
10b10 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
10b20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b30 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10b40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
10b50 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
10b60 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
10b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
10b80 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
10b90 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61   zMaster */..  a
10ba0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
10bb0 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20  etMaster==0 );. 
10bc0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
10bd0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
10be0 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
10bf0 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
10c00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
10c10 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
10c20 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73  EMORY .   || !is
10c30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
10c40 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10c50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10c60 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
10c70 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
10c80 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10c90 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
10ca0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
10cb0 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20  .  /* Calculate 
10cc0 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79  the length in by
10cd0 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63  tes and the chec
10ce0 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20  ksum of zMaster 
10cf0 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72  */.  for(nMaster
10d00 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73  =0; zMaster[nMas
10d10 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29  ter]; nMaster++)
10d20 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
10d30 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
10d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
10d50 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10d60 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
10d70 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
10d80 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
10d90 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
10da0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
10db0 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
10dc0 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
10dd0 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
10de0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
10df0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
10e00 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
10e10 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10e20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
10e30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
10e40 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
10e50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64  ager);.  }.  iHd
10e60 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
10e70 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
10e80 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   Write the maste
10e90 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74  r journal data t
10ea0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
10eb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
10ec0 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
10ed0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74  occurs, return t
10ee0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
10ef0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
10f00 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72  /.  if( (0 != (r
10f10 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10f20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10f30 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  rOff, PAGER_MJ_P
10f40 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20  GNO(pPager)))). 
10f50 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f60 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
10f70 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10f80 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69  ster, nMaster, i
10f90 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c  HdrOff+4))).   |
10fa0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
10fb0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
10fc0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
10fd0 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65  +nMaster, nMaste
10fe0 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  r))).   || (0 !=
10ff0 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11000 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11010 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11020 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20  r+4, cksum))).  
11030 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11040 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11050 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75  Pager->jfd, aJou
11060 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20  rnalMagic, 8,.  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
11090 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
110a0 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
110b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
110c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110d0 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
110e0 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0);..  /* If the
110f0 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
11100 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
11110 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
11120 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
11130 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
11140 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
11150 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
11160 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
11170 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
11180 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
11190 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
111a0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
111b0 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
111c0 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
111d0 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
111e0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
111f0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
11200 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
11210 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
11220 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
11230 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
11240 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
11250 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
11260 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
11270 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
11280 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
11290 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
112a0 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
112b0 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
112c0 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
112d0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
112e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
112f0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
11300 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
11310 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
11320 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
11330 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
11340 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
11350 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11360 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
11370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  c;.}../*.** Disc
11390 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63  ard the entire c
113a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69  ontents of the i
113b0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61  n-memory page-ca
113c0 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  che..*/.static v
113d0 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
113e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
113f0 20 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56    pPager->iDataV
11400 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69  ersion++;.  sqli
11410 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
11420 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
11430 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
11440 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
11450 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
11460 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50  ** Return the pP
11470 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69  ager->iDataVersi
11480 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20  on value.*/.u32 
11490 73 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61  sqlite3PagerData
114a0 56 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70  Version(Pager *p
114b0 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
114c0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
114d0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  >PAGER_OPEN );. 
114e0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
114f0 69 44 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a  iDataVersion;.}.
11500 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
11510 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
11520 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
11530 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73  nt[] array and s
11540 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72  et both.** Pager
11550 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20  .aSavepoint and 
11560 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
11570 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20   to zero. Close 
11580 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a  the sub-journal.
11590 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  ** if it is open
115a0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
115b0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
115c0 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ve mode..*/.stat
115d0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
115e0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67  llSavepoints(Pag
115f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
11600 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11610 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
11620 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   for looping thr
11630 6f 75 67 68 20 50 61 67 65 72 2e 61 53 61 76 65  ough Pager.aSave
11640 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69  point */.  for(i
11650 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
11660 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
11670 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
11680 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
11690 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
116a0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
116b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
116c0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
116d0 64 65 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75  de || sqlite3Jou
116e0 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
116f0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
11700 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11710 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
11720 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11730 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
11740 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
11750 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
11760 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11770 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
11780 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
11790 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
117a0 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
117b0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
117c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
117d0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
117e0 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
117f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
11800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
11810 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
11820 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
11830 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
11840 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
11850 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
11860 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
11870 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
11880 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
11890 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
118a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
118b0 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
118c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
118d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
118e0 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
118f0 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
11900 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
11910 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
11920 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
11930 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
11940 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
11950 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
11960 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
11970 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
11980 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
11990 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
119a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
119b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
119c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
119d0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
119e0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
119f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11a00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
11a10 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11a20 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  p if the pager i
11a30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
11a40 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69  ode and not.** i
11a50 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
11a60 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
11a70 20 73 77 69 74 63 68 65 73 20 74 68 65 20 70 61   switches the pa
11a80 67 65 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ger to PAGER_OPE
11a90 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  N.** state..**.*
11aa0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
11ab0 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  s not in exclusi
11ac0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20  ve-access mode, 
11ad0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11ae0 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65  e is.** complete
11af0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20  ly unlocked. If 
11b00 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
11b10 63 6b 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c  cked and the fil
11b20 65 2d 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a  e-system does.**
11b30 20 6e 6f 74 20 65 78 68 69 62 69 74 20 74 68 65   not exhibit the
11b40 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45   UNDELETABLE_WHE
11b50 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c  N_OPEN property,
11b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
11b70 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28  e is.** closed (
11b80 69 66 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a  if it is open)..
11b90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
11ba0 65 72 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73  er is in ERROR s
11bb0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
11bc0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11bd0 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  d, the .** conte
11be0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11bf0 20 63 61 63 68 65 20 61 72 65 20 64 69 73 63 61   cache are disca
11c00 72 64 65 64 20 62 65 66 6f 72 65 20 73 77 69 74  rded before swit
11c10 63 68 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a  ching back to .*
11c20 2a 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  * the OPEN state
11c30 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
11c40 77 68 65 74 68 65 72 20 74 68 65 20 70 61 67 65  whether the page
11c50 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11c60 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74  e-mode.** or not
11c70 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69  , any journal fi
11c80 6c 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  le left in the f
11c90 69 6c 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20  ile-system will 
11ca0 62 65 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73  be treated.** as
11cb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
11cc0 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  nd rolled back t
11cd0 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72  he next time a r
11ce0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ead-transaction.
11cf0 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79  ** is opened (by
11d00 20 74 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20   this or by any 
11d10 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
11d20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
11d30 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
11d40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a  ager *pPager){..
11d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11d60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
11d70 52 45 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c  READER .       |
11d80 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
11d90 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20  ==PAGER_OPEN .  
11da0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11db0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
11dc0 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  ROR .  );..  sql
11dd0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
11de0 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
11df0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
11e00 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
11e10 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
11e20 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
11e30 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
11e40 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
11e50 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
11e60 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
11e70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  );.    sqlite3Wa
11e80 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
11e90 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
11ea0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
11eb0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11ec0 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
11ed0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
11ee0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
11ef0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
11f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
11f10 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
11f20 65 64 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63  ed by pagerUnloc
11f30 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74  kDb() */.    int
11f40 20 69 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50   iDc = isOpen(pP
11f50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65  ager->fd)?sqlite
11f60 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
11f70 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
11f80 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20  >fd):0;..    /* 
11f90 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  If the operating
11fa0 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
11fb0 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e  deletion of open
11fc0 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20   files, then.   
11fd0 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f   ** close the jo
11fe0 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
11ff0 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74  dropping the dat
12000 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68  abase lock.  Oth
12010 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e  erwise.    ** an
12020 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
12030 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f   with journal_mo
12040 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20  de=delete might 
12050 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a  delete the file.
12060 20 20 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20      ** out from 
12070 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f  under us..    */
12080 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12090 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
120a0 4d 45 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31  MEMORY   & 5)!=1
120b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
120c0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
120d0 44 45 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29  DE_OFF      & 5)
120e0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
120f0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
12100 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26  LMODE_WAL      &
12110 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
12120 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12130 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
12140 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12150 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12160 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12170 43 41 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a  CATE & 5)==1 );.
12180 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12190 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
121a0 45 52 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20  ERSIST  & 5)==1 
121b0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69  );.    if( 0==(i
121c0 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
121d0 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
121e0 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c  EN_OPEN).     ||
121f0 20 31 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75   1!=(pPager->jou
12200 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20  rnalMode & 5).  
12210 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
12220 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
12230 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  ->jfd);.    }.. 
12240 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12250 65 72 20 69 73 20 69 6e 20 74 68 65 20 45 52 52  er is in the ERR
12260 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12270 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20   call to unlock 
12280 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
12290 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20   ** file fails, 
122a0 73 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  set the current 
122b0 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f  lock to UNKNOWN_
122c0 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f  LOCK. See the co
122d0 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f  mment.    ** abo
122e0 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
122f0 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  or UNKNOWN_LOCK 
12300 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
12310 6f 6e 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20  on of why this. 
12320 20 20 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61     ** is necessa
12330 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ry..    */.    r
12340 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  c = pagerUnlockD
12350 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43  b(pPager, NO_LOC
12360 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
12370 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
12380 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
12390 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  ER_ERROR ){.    
123a0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
123b0 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a  = UNKNOWN_LOCK;.
123c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
123d0 65 20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61  e pager state ma
123e0 79 20 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f  y be changed fro
123f0 6d 20 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f  m PAGER_ERROR to
12400 20 50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65   PAGER_OPEN here
12410 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20  .    ** without 
12420 63 6c 65 61 72 69 6e 67 20 74 68 65 20 65 72 72  clearing the err
12430 6f 72 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73  or code. This is
12440 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74   intentional - t
12450 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
12460 63 6f 64 65 20 69 73 20 63 6c 65 61 72 65 64 20  code is cleared 
12470 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 72 65  and the cache re
12480 73 65 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b  set in the block
12490 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20   below..    */. 
124a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
124b0 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50  r->errCode || pP
124c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
124d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20  GER_ERROR );.   
124e0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
124f0 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
12500 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
12510 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
12520 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65   }..  /* If Page
12530 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
12540 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
12550 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
12560 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a  e cannot be.  **
12570 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
12580 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
12590 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
125a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
125b0 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e  ger,.  ** it can
125c0 20 73 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63   safely move bac
125d0 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20  k to PAGER_OPEN 
125e0 73 74 61 74 65 2e 20 54 68 69 73 20 68 61 70 70  state. This happ
125f0 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a  ens in both.  **
12600 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c   normal and excl
12610 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
12620 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  de..  */.  if( p
12630 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12640 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
12650 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
12660 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
12670 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
12680 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
12690 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
126a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
126b0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
126c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  ;.    pPager->er
126d0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
126e0 4b 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  K;.    if( USEFE
126f0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
12700 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
12710 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
12720 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
12730 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
12740 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12750 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61  alHdr = 0;.  pPa
12760 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
12770 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
12780 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12790 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e  lled whenever an
127a0 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65   IOERR or FULL e
127b0 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72  rror that requir
127c0 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  es.** the pager 
127d0 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e  to transition in
127e0 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  to the ERROR sta
127f0 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75  te may ahve occu
12800 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72  rred..** The fir
12810 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
12820 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12830 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  pager structure,
12840 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
12850 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
12860 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
12870 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
12880 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
12890 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72   .** value retur
128a0 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
128b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
128c0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
128d0 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
128e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
128f0 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46  ment is SQLITE_F
12900 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
12910 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a  R or one of the.
12920 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64  ** IOERR sub-cod
12930 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e  es, the pager en
12940 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73  ters the ERROR s
12950 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72  tate and the err
12960 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74  or code.** is st
12970 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72  ored in Pager.er
12980 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65  rCode. While the
12990 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69   pager remains i
129a0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
129b0 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20  e,.** all major 
129c0 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65  API calls on the
129d0 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
129e0 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50  diately return P
129f0 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a  ager.errCode..**
12a00 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74  .** The ERROR st
12a10 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ate indicates th
12a20 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
12a30 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12a40 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
12a50 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
12a60 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
12a70 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
12a80 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
12a90 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12aa0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
12ab0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
12ac0 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
12ad0 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
12ae0 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
12af0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
12b00 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
12b10 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
12b20 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73   replayed to res
12b30 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  tore the content
12b40 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
12b50 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a  e file (as if.**
12b60 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a   it were a hot-j
12b70 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74  ournal)..*/.stat
12b80 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
12b90 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
12ba0 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
12bb0 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
12bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
12bd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12be0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
12bf0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12c00 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12c10 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70  FULL ||.       p
12c20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12c30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20  SQLITE_OK ||.   
12c40 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72      (pPager->err
12c50 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51  Code & 0xff)==SQ
12c60 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a  LITE_IOERR.  );.
12c70 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
12c80 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53  E_FULL || rc2==S
12c90 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
12ca0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
12cb0 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61  de = rc;.    pPa
12cc0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
12cd0 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  GER_ERROR;.  }. 
12ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
12cf0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12d00 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
12d10 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
12d20 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ge);../*.** This
12d30 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12d40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12d50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12d60 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12d70 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12d80 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12d90 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12da0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12db0 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12dc0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12dd0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12de0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12df0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12e00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
12e10 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
12e20 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
12e30 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
12e40 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
12e50 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
12e60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12e70 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12e80 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12e90 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12ea0 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12eb0 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12ec0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12ed0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12ee0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12ef0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12f00 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12f10 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12f20 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12f30 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12f40 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12f50 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12f60 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12f70 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12f80 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12f90 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12fa0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12fb0 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12fc0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12fd0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12fe0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12ff0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
13000 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
13010 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
13020 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
13030 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13040 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13050 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13060 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13070 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13080 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13090 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
130a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
130b0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
130c0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
130d0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
130e0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
130f0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13100 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13110 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13120 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13130 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13140 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13150 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13160 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13170 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13180 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13190 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
131a0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
131b0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
131c0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
131d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
131e0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
131f0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13200 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13210 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13220 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13230 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13240 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13250 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13260 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13270 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13280 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13290 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
132a0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
132b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
132c0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
132d0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
132e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
132f0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13300 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13310 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13320 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13330 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13340 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13350 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13360 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13370 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13380 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13390 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
133a0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
133b0 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
133c0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
133d0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
133e0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
133f0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
13400 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13410 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13420 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
13430 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13440 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13450 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13460 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13470 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13480 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13490 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
134a0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
134b0 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
134c0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
134d0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
134e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
134f0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13500 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
13510 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
13520 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
13530 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
13540 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
13550 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13560 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13570 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13580 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13590 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
135a0 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
135b0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
135c0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
135d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
135e0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
135f0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13600 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
13610 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
13620 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
13630 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
13640 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13650 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
13660 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13670 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13680 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13690 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
136a0 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
136b0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
136c0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
136d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
136e0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
136f0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13700 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
13710 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
13720 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
13730 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
13740 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13750 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
13760 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
13770 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
13780 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13790 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
137a0 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
137b0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
137c0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
137d0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
137e0 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
137f0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13800 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
13810 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13820 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
13830 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
13840 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
13850 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
13860 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
13870 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
13880 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13890 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
138a0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
138b0 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
138c0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
138d0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
138e0 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
138f0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
13900 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
13910 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13920 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13930 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
13940 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
13950 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
13960 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
13970 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
13980 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13990 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
139a0 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
139b0 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
139c0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
139d0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
139e0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
139f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13a00 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13a10 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13a20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
13a30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
13a40 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
13a50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
13a60 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
13a70 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
13a80 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13a90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13aa0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13ab0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13ac0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13ad0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13ae0 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13af0 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13b00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13b10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13b20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
13b30 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
13b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
13b50 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13b60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
13b70 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
13b80 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13b90 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13ba0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13bb0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13bc0 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13bd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13be0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13bf0 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
13c00 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
13c10 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73  ) ){.      /* as
13c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13c30 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13c40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
13c50 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ORY ); */.      
13c60 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
13c70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
13c80 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
13c90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
13ca0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13cb0 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  E_TRUNCATE ){.  
13cc0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13cd0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
13ce0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
13cf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
13d00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13d10 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
13d20 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
13d30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
13d40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13d50 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  && pPager->fullS
13d60 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
13d70 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
13d80 65 20 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20  e new file size 
13d90 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
13da0 74 68 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20  the inode right 
13db0 61 77 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20  away..          
13dc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  ** Otherwise the
13dd0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72   journal might r
13de0 65 73 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69  esurrect followi
13df0 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  ng a power loss 
13e00 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
13e10 20 63 61 75 73 65 20 74 68 65 20 6c 61 73 74 20   cause the last 
13e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72  transaction to r
13e30 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20  oll back.  See. 
13e40 20 20 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70           ** http
13e50 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a  s://bugzilla.moz
13e60 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75  illa.org/show_bu
13e70 67 2e 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33  g.cgi?id=1072773
13e80 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
13e90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13ea0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
13eb0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
13ec0 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
13ed0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13ef0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
13f00 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
13f10 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
13f20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13f30 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c  _PERSIST.      |
13f40 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
13f50 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
13f60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
13f70 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13f80 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20  DE_WAL).    ){. 
13f90 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
13fa0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
13fb0 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
13fc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13fd0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d  alOff = 0;.    }
13fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
13ff0 68 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62  his branch may b
14000 65 20 65 78 65 63 75 74 65 64 20 77 69 74 68 20  e executed with 
14010 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
14020 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20  e==MEMORY if.   
14030 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72     ** a hot-jour
14040 6e 61 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c  nal was just rol
14050 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69  led back. In thi
14060 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
14070 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  al.      ** file
14080 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
14090 64 20 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49  d and deleted. I
140a0 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
140b0 6e 20 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20  n writes to.    
140c0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
140d0 65 20 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20  e file, it will 
140e0 64 6f 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69  do so using an i
140f0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
14100 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14110 20 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 21   int bDelete = !
14120 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14130 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14140 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
14150 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14160 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20  >jfd)==0 );.    
14170 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14180 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14190 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
141a0 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20 20  _DELETE .       
141b0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
141c0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
141d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
141e0 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
141f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
14200 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14210 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
14220 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
14230 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
14240 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
14250 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29 7b    if( bDelete ){
14260 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14270 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14280 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
14290 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
142a0 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 29  ager->extraSync)
142b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
142c0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
142d0 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
142e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
142f0 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
14300 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
14310 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
14320 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
14330 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69  bSize==0 && sqli
14340 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
14350 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
14360 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64  e)>0 ){.    PgHd
14370 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 61  r *p = sqlite3Pa
14380 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
14390 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 1);.    if( p 
143a0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67 65  ){.      p->page
143b0 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  Hash = 0;.      
143c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
143d0 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20  fNotNull(p);.   
143e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
143f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
14400 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
14410 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
14420 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
14430 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
14440 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Rec = 0;.  sqlit
14450 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
14460 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14470 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
14480 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
14490 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
144a0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20 20  er->dbSize);..  
144b0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
144c0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
144d0 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20 77  * Drop the WAL w
144e0 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e  rite-lock, if an
144f0 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  y. Also, if the 
14500 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 69  connection was i
14510 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e  n .    ** lockin
14520 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
14530 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f 20   mode but is no 
14540 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68 65  longer, drop the
14550 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20   EXCLUSIVE .    
14560 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ** lock held on 
14570 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14580 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
14590 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  2 = sqlite3WalEn
145a0 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  dWriteTransactio
145b0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
145c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 32  .    assert( rc2
145d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
145e0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
145f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d  QLITE_OK && bCom
14600 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e 64  mit && pPager->d
14610 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65 72  bFileSize>pPager
14620 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
14630 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
14640 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d  s taken when com
14650 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
14660 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63  ction in rollbac
14670 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  k-journal.    **
14680 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61 74   mode if the dat
14690 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
146a0 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  sk is larger tha
146b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
146c0 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20  mage..    ** At 
146d0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6a  this point the j
146e0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
146f0 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74 68  finalized and th
14700 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
14710 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c     ** successful
14720 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75  ly committed, bu
14730 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  t the EXCLUSIVE 
14740 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68 65  lock is still he
14750 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ld on the.    **
14760 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73 20   file. So it is 
14770 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74 65  safe to truncate
14780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14790 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75  le to its minimu
147a0 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65  m.    ** require
147b0 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  d size.  */.    
147c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
147d0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
147e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  _LOCK );.    rc 
147f0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
14800 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
14810 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
14820 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14830 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
14840 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
14850 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
14860 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
14870 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
14880 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 4f   SQLITE_FCNTL_CO
14890 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20 30  MMIT_PHASETWO, 0
148a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
148b0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
148c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
148d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
148e0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
148f0 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65  de .   && (!page
14900 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14910 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  || sqlite3WalExc
14920 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
14930 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29  r->pWal, 0)).  )
14940 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  {.    rc2 = page
14950 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
14960 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
14970 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
14980 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
14990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65  .  }.  pPager->e
149a0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
149b0 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ADER;.  pPager->
149c0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  setMaster = 0;..
149d0 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
149e0 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
149f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
14a00 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
14a10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
14a20 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
14a30 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
14a40 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  ase file. .**.**
14a50 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14a60 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
14a70 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  d the ERROR stat
14a80 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70  e, do not attemp
14a90 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  t .** the rollba
14aa0 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ck at this time.
14ab0 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f   Instead, pager_
14ac0 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c  unlock() is call
14ad0 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20  ed. The.** call 
14ae0 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
14af0 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61  ) will discard a
14b00 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
14b10 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68  es, unlock.** th
14b20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14b30 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67  and move the pag
14b40 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20  er back to OPEN 
14b50 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a  state. If this .
14b60 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
14b70 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
14b80 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
14b90 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
14ba0 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65  e next .** conne
14bb0 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
14bc0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
14bd0 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63   the pager (whic
14be0 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e  h may be this on
14bf0 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c  e) .** will roll
14c00 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
14c10 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
14c20 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
14c30 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
14c40 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
14c50 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
14c60 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
14c70 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
14c80 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
14c90 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
14ca0 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
14cb0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
14cc0 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
14cd0 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
14ce0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
14cf0 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
14d00 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
14d10 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
14d20 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
14d30 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
14d40 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
14d50 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
14d60 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e  RROR && pPager->
14d70 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
14d80 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  EN ){.    assert
14d90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
14da0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
14db0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14dc0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
14dd0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
14de0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
14df0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
14e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14e10 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
14e20 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
14e30 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
14e40 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  c();.    }else i
14e50 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
14e60 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
14e70 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
14e80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
14e90 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20  _READER );.     
14ea0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
14eb0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
14ec0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
14ed0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
14ee0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
14ef0 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
14f00 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
14f10 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
14f20 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
14f30 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
14f40 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
14f50 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
14f60 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
14f70 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
14f80 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
14f90 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
14fa0 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
14fb0 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
14fc0 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
14fd0 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
14fe0 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
14ff0 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
15000 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
15010 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
15020 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
15030 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
15040 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
15050 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
15060 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
15070 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
15080 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
15090 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
150a0 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
150b0 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
150c0 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
150d0 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
150e0 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
150f0 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
15100 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
15110 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
15120 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
15130 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
15140 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
15150 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
15160 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
15170 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
15180 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
15190 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
151a0 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
151b0 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
151c0 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
151d0 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
151e0 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
151f0 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
15200 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
15210 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
15220 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
15230 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
15240 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
15250 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
15260 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
15270 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
15280 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
15290 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
152a0 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
152b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
152c0 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
152d0 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
152e0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
152f0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
15300 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
15310 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
15320 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
15330 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
15340 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15350 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
15360 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
15370 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
15380 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
15390 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
153a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
153b0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
153c0 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
153d0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
153e0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
153f0 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
15400 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
15410 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
15420 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
15430 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
15450 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
15460 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
15470 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
15480 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
15490 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
154c0 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
154d0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
154e0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
154f0 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
15500 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
15510 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
15520 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   */.#endif..#ifd
15530 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15540 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  DEC./*.** Make s
15550 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
15560 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73 20  f reserved bits 
15570 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20 74  is the same in t
15580 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a  he destination.*
15590 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69 73  * pager as it is
155a0 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e 20   in the source. 
155b0 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20 77   This comes up w
155c0 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68 61  hen a VACUUM cha
155d0 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  nges the.** numb
155e0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
155f0 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74 69  its to the "opti
15600 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a  mal" amount..*/.
15610 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15620 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50 61  rAlignReserve(Pa
15630 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67 65  ger *pDest, Page
15640 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28 20  r *pSrc){.  if( 
15650 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 21  pDest->nReserve!
15660 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 20  =pSrc->nReserve 
15670 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e 52  ){.    pDest->nR
15680 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e 6e  eserve = pSrc->n
15690 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
156a0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44 65  erReportSize(pDe
156b0 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  st);.  }.}.#endi
156c0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  f../*.** Read a 
156d0 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
156e0 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
156f0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
15700 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
15710 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
15720 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
15730 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
15740 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
15750 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
15760 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
15770 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
15780 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
15790 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
157a0 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
157b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
157c0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
157d0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
157e0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
157f0 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65  journal uses che
15800 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
15810 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
15820 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a  oes .** not..**.
15830 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  ** If the page n
15840 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
15850 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66 72  e record read fr
15860 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
15870 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
15880 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
15890 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
158a0 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  f Pager.dbSize, 
158b0 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73  then playback is
158c0 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20  .** skipped and 
158d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
158e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
158f0 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
15900 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
15910 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
15920 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
15930 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
15940 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
15950 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
15960 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
15970 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
15980 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
15990 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
159a0 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
159b0 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
159c0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
159d0 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
159e0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
159f0 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
15a00 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
15a10 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
15a20 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  * If the page re
15a30 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73 66  cord is successf
15a40 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15a50 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15a60 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61   file.** and pla
15a70 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53  yed back, then S
15a80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15a90 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
15aa0 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77  rror occurs.** w
15ab0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65  hile reading the
15ac0 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
15ad0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15ae0 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69  ile or while wri
15af0 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64  ting.** to the d
15b00 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
15b10 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
15b20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
15b30 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20  . If data.** is 
15b40 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
15b50 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15b60 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75  )journal file bu
15b70 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a  t appears to be.
15b80 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  ** corrupted, SQ
15b90 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74  LITE_DONE is ret
15ba0 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63  urned. Data is c
15bb0 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75 70  onsidered corrup
15bc0 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69  ted in.** two ci
15bd0 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20  rcumstances:.** 
15be0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72  .**   * If the r
15bf0 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65  ecord page-numbe
15c00 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20  r is illegal (0 
15c10 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  or PAGER_MJ_PGNO
15c20 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20  ), or.**   * If 
15c30 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62 65  the record is be
15c40 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
15c50 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
15c60 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20  urnal file.**   
15c70 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73    and the checks
15c80 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f  um field does no
15c90 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f  t match the reco
15ca0 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a  rd content..**.*
15cb0 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65  * Neither of the
15cc0 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  se two scenarios
15cd0 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75   are possible du
15ce0 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74  ring a savepoint
15cf0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
15d00 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73 61   If this is a sa
15d10 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15d20 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61  , then memory ma
15d30 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e  y have to be dyn
15d40 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f  amically.** allo
15d50 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
15d60 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20  nction. If this 
15d70 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64 20  is the case and 
15d80 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  an allocation fa
15d90 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ils,.** SQLITE_N
15da0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
15db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15dc0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
15dd0 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
15de0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
15df0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15e00 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
15e10 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34  ed back */.  i64
15e20 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20   *pOffset,      
15e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
15e40 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74  fset of record t
15e50 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20  o playback */.  
15e60 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20  Bitvec *pDone,  
15e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15e80 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
15e90 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20   already played 
15ea0 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
15eb0 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20  MainJrnl,       
15ec0 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20          /* 1 -> 
15ed0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20  main journal. 0 
15ee0 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  -> sub-journal. 
15ef0 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
15f00 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
15f10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
15f20 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
15f30 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ack */.){.  int 
15f40 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
15f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15f60 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
15f70 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
15f80 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
15f90 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
15fa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
15fb0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
15fc0 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
15fd0 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
16000 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
16010 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61  hecking */.  cha
16020 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  r *aData;       
16030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
16040 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20  mporary storage 
16050 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  for the page */.
16060 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16070 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
16080 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
16090 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a  riptor for the j
160a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
160b0 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20   int isSynced;  
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160d0 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
160e0 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65 64  l page is synced
160f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
16100 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d  isMainJrnl&~1)==
16110 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d  0 );      /* isM
16120 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20  ainJrnl is 0 or 
16130 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  1 */.  assert( (
16140 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30  isSavepnt&~1)==0
16150 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53   );       /* isS
16160 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31  avepnt is 0 or 1
16170 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
16180 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e  MainJrnl || pDon
16190 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e  e );     /* pDon
161a0 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e  e always used on
161b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
161c0 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76  .  assert( isSav
161d0 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30  epnt || pDone==0
161e0 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e   );   /* pDone n
161f0 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e  ever used on non
16200 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20  -savepoint */.. 
16210 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d   aData = pPager-
16220 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73  >pTmpSpace;.  as
16230 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20  sert( aData );  
16240 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
16250 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65  torage must have
16260 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
16270 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73  located */.  ass
16280 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
16290 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28  (pPager)==0 || (
162a0 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69  !isMainJrnl && i
162b0 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20  sSavepnt) );..  
162c0 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73 74  /* Either the st
162d0 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ate is greater t
162e0 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52  han PAGER_WRITER
162f0 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61  _CACHEMOD (a tra
16300 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f  nsaction .  ** o
16310 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  r savepoint roll
16320 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65  back done at the
16330 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65 20   request of the 
16340 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20  caller) or this 
16350 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  is.  ** a hot-jo
16360 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
16370 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a  If it is a hot-j
16380 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
16390 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
163a0 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e  is in state OPEN
163b0 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58   and holds an EX
163c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f  CLUSIVE lock. Ho
163d0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
163e0 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61  ck.  ** only rea
163f0 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
16400 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68   journal, not th
16410 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
16420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
16430 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
16440 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
16450 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  MOD.       || (p
16460 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
16470 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61  AGER_OPEN && pPa
16480 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
16490 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
164a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
164b0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
164c0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
164d0 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29   || isMainJrnl )
164e0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
164f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
16500 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20   page data from 
16510 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  the journal or s
16520 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  ub-journal.  ** 
16530 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20  file. Return an 
16540 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
16550 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49  e caller if an I
16560 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  O error occurs..
16570 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d    */.  jfd = isM
16580 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
16590 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
165a0 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  sjfd;.  rc = rea
165b0 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f  d32bits(jfd, *pO
165c0 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20  ffset, &pgno);. 
165d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
165e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
165f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16600 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61  Read(jfd, (u8*)a
16610 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
16620 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65  geSize, (*pOffse
16630 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  t)+4);.  if( rc!
16640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16650 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73  urn rc;.  *pOffs
16660 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  et += pPager->pa
16670 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d  geSize + 4 + isM
16680 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a  ainJrnl*4;..  /*
16690 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
166a0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
166b0 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
166c0 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
166d0 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
166e0 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
166f0 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
16700 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
16710 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
16720 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
16730 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
16740 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
16750 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
16760 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
16770 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
16780 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
16790 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
167a0 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
167b0 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
167c0 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
167d0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
167e0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
167f0 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70  assert( !isSavep
16800 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt );.    return
16810 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
16820 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67  }.  if( pgno>(Pg
16830 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no)pPager->dbSiz
16840 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  e || sqlite3Bitv
16850 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67  ecTest(pDone, pg
16860 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  no) ){.    retur
16870 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16880 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16890 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
168a0 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a  ad32bits(jfd, (*
168b0 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73  pOffset)-4, &cks
168c0 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
168d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
168e0 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20   if( !isSavepnt 
168f0 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70  && pager_cksum(p
16900 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74  Pager, (u8*)aDat
16910 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
16920 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16930 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
16940 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
16950 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
16960 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
16970 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20 74   before during t
16980 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
16990 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64  rollback, then d
169a0 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20 70  on't bother to p
169b0 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61 69  lay it back agai
169c0 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44  n..  */.  if( pD
169d0 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  one && (rc = sql
169e0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44  ite3BitvecSet(pD
169f0 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c  one, pgno))!=SQL
16a00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16a10 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
16a20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
16a30 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65 73  back page 1, res
16a40 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72 76  tore the nReserv
16a50 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20  e setting.  */. 
16a60 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20   if( pgno==1 && 
16a70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
16a80 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  !=((u8*)aData)[2
16a90 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0] ){.    pPager
16aa0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28 75  ->nReserve = ((u
16ab0 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20  8*)aData)[20];. 
16ac0 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69     pagerReportSi
16ad0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ze(pPager);.  }.
16ae0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
16af0 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d 4f  er is in CACHEMO
16b00 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68  D state, then th
16b10 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f  ere must be a co
16b20 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20  py of this.  ** 
16b30 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65  page in the page
16b40 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73  r cache. In this
16b50 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74   case just updat
16b60 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
16b70 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20  e,.  ** not the 
16b80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
16b90 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20  he page is left 
16ba0 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20  marked dirty in 
16bb0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a  this case..  **.
16bc0 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f    ** An exceptio
16bd0 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72  n to the above r
16be0 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61  ule: If the data
16bf0 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79  base is in no-sy
16c00 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  nc mode.  ** and
16c10 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
16c20 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65   during an incre
16c30 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68  mental vacuum th
16c40 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a  en the page may.
16c50 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74    ** not be in t
16c60 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16c70 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c  Later: if a mall
16c80 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72  oc() or IO error
16c90 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
16ca0 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29  ing a Movepage()
16cb0 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20   call, then the 
16cc0 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  page may not be 
16cd0 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a  in the cache.  *
16ce0 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65  * either. So the
16cf0 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
16d00 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76  ibed in the abov
16d10 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e  e paragraph is n
16d20 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  ot.  ** assert()
16d30 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
16d40 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  If in WRITER_DBM
16d50 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49 53  OD, WRITER_FINIS
16d60 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74  HED or OPEN stat
16d70 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
16d80 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 72  e the.  ** pager
16d90 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
16da0 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  sts and the main
16db0 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
16dc0 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a  is then marked .
16dd0 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20    ** not dirty. 
16de0 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65 20  Since this code 
16df0 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65 64  is only executed
16e00 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
16e10 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20  tate for.  ** a 
16e20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16e30 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61 72  back, it is guar
16e40 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20  anteed that the 
16e50 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65 6d  page-cache is em
16e60 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  pty.  ** if the 
16e70 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45 4e  pager is in OPEN
16e80 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a   state..  **.  *
16e90 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
16ea0 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
16eb0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
16ec0 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
16ed0 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
16ee0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
16ef0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
16f00 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16f10 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
16f20 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
16f30 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
16f40 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
16f50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
16f60 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
16f70 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
16f80 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
16f90 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
16fa0 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
16fb0 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
16fc0 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
16fd0 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
16fe0 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
16ff0 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
17000 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
17010 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17020 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63  ontents are sync
17030 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ed into the main
17040 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
17050 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
17060 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73  se, a power loss
17070 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64   might leave mod
17080 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74 68  ified data in th
17090 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
170a0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20  file without an 
170b0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c  entry in the rol
170c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68  lback journal th
170d0 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74  at can.  ** rest
170e0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
170f0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
17100 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64   form.  Two cond
17110 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20  itions must be. 
17120 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77   ** met before w
17130 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
17140 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31  tabase files. (1
17150 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  ) the database m
17160 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b  ust be.  ** lock
17170 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77  ed.  (2) we know
17180 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
17190 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  al page content 
171a0 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a  is fully synced.
171b0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e    ** in the main
171c0 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
171d0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
171e0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
171f0 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68   or else.  ** th
17200 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  e page is marked
17210 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
17220 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d  .  **.  ** 2008-
17230 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74  04-14:  When att
17240 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75  empting to vacuu
17250 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  m a corrupt data
17260 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20  base file, it.  
17270 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
17280 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65  o fail a stateme
17290 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65  nt on a database
172a0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79   that does not y
172b0 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44  et exist..  ** D
172c0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
172d0 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62 61   write if databa
172e0 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65  se file has neve
172f0 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20  r been opened.. 
17300 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 55   */.  if( pagerU
17310 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
17320 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
17330 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20 3d  }else{.    pPg =
17340 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
17350 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
17360 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
17370 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
17380 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
17390 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
173a0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
173b0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
173c0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
173d0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
173e0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
173f0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
17400 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
17410 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
17420 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
17430 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
17440 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
17450 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
17460 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
17470 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
17480 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
17490 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
174a0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
174b0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
174c0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
174d0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
174e0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
174f0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
17500 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
17510 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
17520 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
17530 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
17540 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
17550 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
17560 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
17570 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
17580 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
17590 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
175a0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
175b0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
175c0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
175d0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
175e0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
175f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
17600 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
17610 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
17620 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
17630 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
17640 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20  pPager->fd, (u8 
17650 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  *)aData, pPager-
17660 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29  >pageSize, ofst)
17670 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ;.    if( pgno>p
17680 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17690 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
176a0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
176b0 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
176c0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
176d0 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  kup ){.      COD
176e0 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
176f0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
17700 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
17710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
17720 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
17730 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
17740 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
17750 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
17760 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17770 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
17780 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74  NOMEM_BKPT, aDat
17790 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
177a0 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
177b0 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
177c0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
177d0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
177e0 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
177f0 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
17800 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
17810 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
17820 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17830 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
17840 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
17850 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
17860 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
17870 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
17880 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
17890 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
178a0 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
178b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
178c0 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
178d0 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
178e0 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
178f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
17900 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
17910 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
17920 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
17930 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
17940 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
17950 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
17960 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
17970 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
17980 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
17990 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
179a0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
179b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
179c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
179d0 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
179e0 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
179f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
17a00 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
17a10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
17a20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
17a30 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
17a40 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
17a50 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
17a60 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
17a70 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
17a80 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
17a90 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
17aa0 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
17ab0 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
17ac0 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
17ad0 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
17ae0 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
17af0 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
17b00 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
17b10 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
17b20 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
17b30 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
17b40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
17b50 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
17b60 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
17b70 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20  OLLBACK)==0 );. 
17b80 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
17b90 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
17ba0 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
17bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17bc0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
17bd0 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  no, &pPg, 1);.  
17be0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
17bf0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
17c00 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17c10 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  CK)!=0 );.    pP
17c20 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17c30 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52   &= ~SPILLFLAG_R
17c40 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28  OLLBACK;.    if(
17c50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17c70 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
17c80 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
17c90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17ca0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
17cb0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29  .  }.  if( pPg )
17cc0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65  {.    /* No page
17cd0 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20   should ever be 
17ce0 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65  explicitly rolle
17cf0 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69  d back that is i
17d00 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20  n use, except.  
17d10 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20    ** for page 1 
17d20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e  which is held in
17d30 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f   use in order to
17d40 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f   keep the lock o
17d50 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
17d60 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f  abase active. Ho
17d70 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67  wever such a pag
17d80 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20  e may be rolled 
17d90 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
17da0 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e  .    ** of an in
17db0 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73  ternal error res
17dc0 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74  ulting in an aut
17dd0 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20  omatic call to. 
17de0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67     ** sqlite3Pag
17df0 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20  erRollback()..  
17e00 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70    */.    void *p
17e10 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20  Data;.    pData 
17e20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
17e30 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
17e40 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
17e50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
17e60 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
17e70 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69  iter(pPg);.    i
17e80 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  f( isMainJrnl &&
17e90 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20   (!isSavepnt || 
17ea0 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72  *pOffset<=pPager
17eb0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b  ->journalHdr) ){
17ec0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
17ed0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
17ee0 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74  s page were just
17ef0 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74   restored from t
17f00 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a  he main .      *
17f10 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
17f20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  then its content
17f30 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79   must be as they
17f40 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a   were when the .
17f50 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
17f60 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f  tion was first o
17f70 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
17f80 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20  ase we can mark 
17f90 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
17fa0 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63  * as clean, sinc
17fb0 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20  e there will be 
17fc0 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  no need to write
17fd0 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20   it out to the. 
17fe0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
17ff0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
18000 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65   ** There is one
18010 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68   exception to th
18020 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20  is rule. If the 
18030 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f  page is being ro
18040 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61  lled.      ** ba
18050 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ck as part of a 
18060 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74  savepoint (or st
18070 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63  atement) rollbac
18080 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20  k from an .     
18090 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   ** unsynced por
180a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e  tion of the main
180b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
180c0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61  hen it is not sa
180d0 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  fe.      ** to m
180e0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
180f0 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62  clean. This is b
18100 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74  ecause marking t
18110 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20  he page as.     
18120 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63   ** clean will c
18130 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
18140 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53  EED_SYNC flag. S
18150 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73  ince the page is
18160 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
18170 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
18180 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20   file (recorded 
18190 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
181a0 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a  nal) and.      *
181b0 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
181c0 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c  _SYNC flag is cl
181d0 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61  eared, if the pa
181e0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ge is written to
181f0 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
18200 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
18210 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c  saction, it will
18220 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
18230 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a  rty but.      **
18240 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
18250 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e  SYNC flag will n
18260 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f  ot be set. It co
18270 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69  uld then potenti
18280 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  ally.      ** be
18290 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74   written out int
182a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
182b0 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a  ile before its j
182c0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
182d0 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
182e0 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61  synced. If a cra
182f0 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  sh occurs during
18300 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   or following th
18310 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  is,.      ** dat
18320 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
18330 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20   may ensue..    
18340 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
18350 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
18360 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
18370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
18380 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
18390 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
183a0 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
183b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
183c0 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
183d0 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
183e0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
183f0 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
18400 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
18410 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
18420 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
18430 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18440 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
18450 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
18460 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
18470 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18480 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
18490 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
184a0 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
184b0 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
184c0 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
184d0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c  a, pPg->pgno, 3,
184e0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
184f0 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71 6c 69  _BKPT);.    sqli
18500 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
18510 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
18520 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18530 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
18540 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
18550 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18560 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
18570 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
18580 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
18590 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
185a0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
185b0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
185c0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
185d0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
185e0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
185f0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
18600 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18610 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
18620 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
18630 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
18640 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
18650 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
18660 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
18670 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
18680 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
18690 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
186a0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
186b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
186c0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
186d0 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
186e0 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
186f0 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
18700 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
18710 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
18720 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
18730 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
18740 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
18750 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
18760 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
18770 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
18780 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
18790 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
187a0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
187b0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
187c0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
187d0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
187e0 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
187f0 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
18800 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
18810 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
18820 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
18830 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
18840 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
18850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18860 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
18870 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
18880 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
18890 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
188a0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
188b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
188c0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
188d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
188e0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
188f0 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
18900 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
18910 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
18920 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
18930 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
18940 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
18950 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
18960 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18970 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
18980 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
18990 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
189a0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
189b0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
189c0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
189d0 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
189e0 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
189f0 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
18a00 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
18a10 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
18a20 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
18a30 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
18a40 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
18a50 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
18a60 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
18a70 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
18a80 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
18a90 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
18aa0 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
18ab0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
18ac0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
18ad0 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
18ae0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
18af0 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
18b00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
18b10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
18b20 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
18b30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
18b40 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
18b50 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
18b60 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
18b70 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
18b80 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
18b90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18ba0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
18bb0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
18bc0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
18bd0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18be0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
18bf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
18c00 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
18c10 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
18c20 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
18c30 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
18c40 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
18c50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
18c60 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
18c70 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
18c80 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
18c90 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
18ca0 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
18cb0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
18cc0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
18cd0 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
18ce0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
18cf0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
18d00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18d10 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
18d20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18d40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
18d50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
18d60 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
18d70 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
18d80 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
18d90 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
18da0 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
18db0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
18dc0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
18dd0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
18de0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
18df0 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
18e00 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
18e10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18e20 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
18e30 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
18e40 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
18e50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
18e60 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
18e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18e80 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
18e90 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
18ea0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
18eb0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18ec0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
18ed0 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
18ee0 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
18ef0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
18f00 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
18f10 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
18f20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
18f30 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
18f40 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
18f50 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
18f60 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
18f70 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
18f80 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
18f90 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
18fa0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
18fb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
18fc0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
18fd0 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
18fe0 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
18ff0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
19000 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
19010 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
19020 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
19030 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
19040 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
19050 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19060 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
19070 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19080 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19090 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
190a0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
190b0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
190c0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
190d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
190e0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
190f0 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
19100 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
19110 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19120 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19130 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19140 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19150 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19160 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19170 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19180 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19190 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
191a0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
191b0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
191c0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
191d0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
191e0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
191f0 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
19200 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
19210 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
19220 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19230 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19240 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19250 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19260 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19270 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19290 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
192a0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
192b0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
192c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
192d0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
192e0 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
192f0 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
19300 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
19310 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
19320 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
19330 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19340 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
19350 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
19360 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
19370 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
19380 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
19390 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
193a0 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
193b0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
193c0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
193d0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
193e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
193f0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19400 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
19410 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
19420 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
19430 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
19440 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
19450 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
19460 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
19470 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
19480 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
19490 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
194a0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
194b0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
194c0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
194d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
194e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
194f0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19500 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
19510 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
19520 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
19530 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
19540 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
19550 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
19560 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
19570 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
19580 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
19590 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
195a0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
195b0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
195c0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
195d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
195e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
195f0 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
19600 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
19610 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
19620 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
19630 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
19640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19650 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
19660 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
19670 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
19680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
196a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
196b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
196c0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
196d0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
196e0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
196f0 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
19700 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
19710 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
19720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19730 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19740 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19750 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19760 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
19770 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
19780 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
19790 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
197a0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
197b0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
197c0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
197d0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
197e0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
197f0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19800 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19810 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
19820 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
19830 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
19840 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
19850 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19860 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
19870 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
19880 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
19890 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
198a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
198b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
198c0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
198d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
198e0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
198f0 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
19900 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
19910 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19920 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
19930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
19940 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19950 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
19960 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
19970 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
19980 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
19990 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
199a0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
199b0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
199c0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
199d0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
199e0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
199f0 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
19a00 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
19a10 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
19a20 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
19a30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19a40 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
19a50 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
19a60 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
19a70 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
19a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
19a90 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
19aa0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
19ab0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19ac0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
19ad0 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
19ae0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19af0 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
19b00 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19b10 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
19b20 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
19b30 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
19b40 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
19b50 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
19b60 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
19b70 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
19b80 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
19b90 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
19ba0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
19bb0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
19bc0 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
19bd0 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
19be0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
19bf0 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
19c00 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
19c10 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
19c20 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
19c30 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
19c40 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
19c50 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
19c60 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
19c70 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
19c80 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
19c90 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
19ca0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
19cb0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19cd0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
19ce0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
19cf0 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
19d00 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
19d10 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
19d20 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
19d30 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
19d40 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
19d50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19d60 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
19d70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19d80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19d90 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
19da0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
19db0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
19dc0 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
19dd0 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
19de0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
19df0 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
19e00 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
19e10 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
19e20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
19e30 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
19e40 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
19e50 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
19e60 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
19e70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19e90 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
19ea0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
19eb0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
19ec0 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
19ed0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
19ee0 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
19ef0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
19f00 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
19f10 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
19f20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
19f30 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
19f40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19f50 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
19f60 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
19f70 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
19f80 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
19f90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
19fa0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
19fb0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
19fc0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
19fd0 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
19fe0 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
19ff0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
1a000 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
1a010 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1a020 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
1a030 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
1a040 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1a050 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1a060 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
1a070 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
1a080 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1a090 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
1a0a0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1a0b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a0c0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1a0d0 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
1a0e0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
1a0f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a110 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1a120 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1a130 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
1a140 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a160 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
1a170 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1a180 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
1a190 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
1a1a0 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
1a1b0 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
1a1c0 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
1a1d0 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
1a1e0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
1a1f0 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1a200 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1a210 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
1a220 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
1a230 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
1a240 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
1a250 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1a260 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1a270 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1a280 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1a290 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1a2a0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1a2b0 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1a2c0 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1a2d0 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1a2e0 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1a2f0 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1a300 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1a310 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1a320 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1a330 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1a340 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1a350 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1a360 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1a370 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1a380 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1a390 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1a3a0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1a3b0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1a3c0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1a3d0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1a3e0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1a3f0 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1a400 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1a410 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1a420 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1a430 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1a440 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1a450 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1a460 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1a470 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1a480 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1a490 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1a4a0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1a4b0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1a4c0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1a4d0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1a4e0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1a4f0 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1a500 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1a510 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a520 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1a530 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1a540 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1a550 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1a560 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1a570 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1a580 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1a590 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1a5a0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a5b0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1a5c0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1a5d0 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1a5e0 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1a5f0 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1a600 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1a610 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1a620 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1a630 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1a640 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1a650 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1a660 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1a670 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1a680 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1a690 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1a6a0 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1a6b0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1a6c0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1a6d0 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1a6e0 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1a6f0 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1a700 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1a710 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1a720 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1a730 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1a740 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1a750 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1a760 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a770 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1a780 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1a790 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1a7a0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1a7b0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1a7c0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1a7d0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1a7e0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1a7f0 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1a800 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a810 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a820 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1a830 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1a840 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1a850 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1a860 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1a870 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1a880 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1a890 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1a8a0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1a8b0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1a8c0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1a8d0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1a8e0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1a8f0 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1a900 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1a910 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1a920 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1a930 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1a940 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1a950 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1a960 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1a970 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1a980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1a990 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1a9a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a9b0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1a9c0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1a9d0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1a9e0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1a9f0 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1aa00 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1aa10 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1aa20 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1aa30 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1aa40 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1aa50 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1aa60 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1aa70 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1aa80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1aa90 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1aaa0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1aab0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1aac0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1aad0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1aae0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1aaf0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1ab00 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1ab10 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1ab20 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1ab30 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1ab40 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1ab50 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1ab60 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1ab70 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1ab80 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1ab90 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1aba0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1abb0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1abc0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1abd0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1abe0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1abf0 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1ac00 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1ac10 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1ac20 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1ac30 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1ac40 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1ac50 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1ac60 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1ac70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1ac80 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1ac90 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1aca0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1acb0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1acc0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1acd0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1ace0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1acf0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1ad00 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1ad10 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1ad20 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1ad30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ad40 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1ad50 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1ad60 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1ad70 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1ad80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1ad90 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1ada0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1adb0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1adc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1add0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1ade0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1adf0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1ae00 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1ae10 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1ae20 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1ae30 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1ae40 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1ae50 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1ae60 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1ae70 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1ae80 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1ae90 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1aea0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1aeb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1aec0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1aed0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1aee0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1aef0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1af00 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1af10 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1af20 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1af30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1af40 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1af50 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1af60 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1af70 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1af80 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1af90 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1afa0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1afb0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1afc0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1afd0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1afe0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1aff0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1b000 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1b010 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1b020 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1b030 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1b040 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1b050 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1b060 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1b070 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1b080 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1b090 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1b0a0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1b0b0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1b0c0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1b0d0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1b0e0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1b0f0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1b100 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1b110 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1b120 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1b130 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1b140 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1b150 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1b160 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1b170 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1b180 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1b190 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1b1a0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1b1b0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1b1c0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1b1d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1b1e0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1b1f0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1b200 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1b210 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1b220 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1b230 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b240 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1b250 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1b260 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1b270 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1b280 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1b290 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1b2a0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1b2b0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1b2c0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1b2d0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1b2e0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1b2f0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1b300 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1b310 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1b320 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1b330 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1b340 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1b350 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1b360 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1b370 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1b380 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1b390 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1b3a0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1b3b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1b3c0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1b3d0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1b3e0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1b3f0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1b400 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1b410 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1b420 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1b430 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1b440 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1b450 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1b460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1b470 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1b480 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1b490 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1b4a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1b4b0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1b4c0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1b4d0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1b4e0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1b4f0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1b520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1b530 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1b540 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1b550 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b560 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1b570 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1b580 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1b590 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1b5a0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1b5b0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1b5c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1b5d0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1b5e0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1b5f0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1b620 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1b630 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b650 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1b660 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1b670 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1b680 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1b690 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1b6a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b6b0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1b6c0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1b6d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1b6e0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1b6f0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1b700 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1b710 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1b720 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1b730 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1b740 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1b750 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46  urnal */..  /* F
1b760 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
1b770 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
1b780 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b790 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
1b7a0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
1b7b0 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
1b7c0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b7d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1b7e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b7f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1b800 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
1b810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b820 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
1b830 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
1b840 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
1b850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
1b860 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
1b870 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
1b880 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
1b890 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b8a0 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
1b8b0 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
1b8c0 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
1b8d0 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
1b8e0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1b8f0 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
1b900 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
1b910 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
1b920 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   back..  **.  **
1b930 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c   TODO: Technical
1b940 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
1b950 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63   is an error bec
1b960 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20  ause it assumes 
1b970 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  that.  ** buffer
1b980 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
1b990 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b   is (mxPathname+
1b9a0 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67  1) bytes or larg
1b9b0 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20  er. i.e. that.  
1b9c0 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ** (pPager->page
1b9d0 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e  Size >= pPager->
1b9e0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1b9f0 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e  +1). Using os_un
1ba00 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74  ix.c,.  ** mxPat
1ba10 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68  hname is 512, wh
1ba20 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20  ich is the same 
1ba30 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61  as the minimum a
1ba40 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20  llowable value. 
1ba50 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65   ** for pageSize
1ba60 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  ..  */.  zMaster
1ba70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1ba80 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61  pace;.  rc = rea
1ba90 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1baa0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1bab0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1bac0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1bad0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1bae0 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72  TE_OK && zMaster
1baf0 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [0] ){.    rc = 
1bb00 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
1bb10 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
1bb20 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1bb30 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a  STS, &res);.  }.
1bb40 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
1bb50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bb60 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20  OK || !res ){.  
1bb70 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1bb80 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
1bb90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1bba0 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65  0;.  needPagerRe
1bbb0 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20  set = isHot;..  
1bbc0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
1bbd0 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
1bbe0 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61  hen a readJourna
1bbf0 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20  lHdr() or .  ** 
1bc00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1bc10 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72  ne_page() call r
1bc20 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1bc30 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  NE or an IO erro
1bc40 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20  r .  ** occurs. 
1bc50 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  .  */.  while( 1
1bc60 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20   ){.    /* Read 
1bc70 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
1bc80 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
1bc90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1bca0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
1bcb0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
1bcc0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
1bcd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1bce0 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
1bcf0 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
1bd00 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
1bd10 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
1bd20 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
1bd30 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
1bd40 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
1bd50 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
1bd60 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
1bd70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
1bd80 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
1bd90 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
1bda0 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
1bdb0 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
1bdc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1bdd0 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
1bde0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1bdf0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
1be00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1be10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1be20 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1be30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1be40 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
1be50 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
1be60 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
1be70 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
1be80 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
1be90 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
1bea0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1beb0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1bec0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
1bed0 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
1bee0 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
1bef0 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
1bf00 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
1bf10 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
1bf20 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
1bf30 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
1bf40 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bf50 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
1bf60 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
1bf70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1bf80 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bf90 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bfa0 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
1bfb0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
1bfc0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1bfd0 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
1bfe0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
1bff0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1c000 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
1c010 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
1c020 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
1c030 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
1c040 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
1c050 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
1c060 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
1c070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
1c080 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
1c090 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
1c0a0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1c0b0 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
1c0c0 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
1c0d0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
1c0e0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
1c0f0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
1c100 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
1c110 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
1c120 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
1c130 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1c140 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
1c150 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
1c160 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
1c170 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
1c180 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
1c190 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
1c1a0 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
1c1b0 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
1c1c0 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
1c1d0 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
1c1e0 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
1c1f0 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
1c200 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1c210 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
1c220 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
1c230 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
1c240 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
1c250 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
1c260 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c270 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
1c290 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
1c2a0 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
1c2b0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
1c2c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
1c2d0 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
1c2e0 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
1c2f0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
1c300 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
1c310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c320 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c330 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
1c340 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
1c350 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c360 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
1c370 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
1c380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1c390 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
1c3a0 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
1c3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
1c3c0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
1c3d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1c3e0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1c3f0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
1c400 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
1c410 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
1c420 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
1c430 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
1c440 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
1c450 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  al size..    */.
1c460 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c470 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
1c480 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1c490 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
1c4a0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1c4b0 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20  pPager, mxPg);. 
1c4c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4e0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1c4f0 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ack;.      }.   
1c500 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c510 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a  e = mxPg;.    }.
1c520 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
1c530 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
1c540 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
1c550 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
1c560 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73   .    ** databas
1c570 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61  e file and/or pa
1c580 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  ge cache..    */
1c590 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c  .    for(u=0; u<
1c5a0 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  nRec; u++){.    
1c5b0 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52    if( needPagerR
1c5c0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  eset ){.        
1c5d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
1c5e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65  er);.        nee
1c5f0 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b  dPagerReset = 0;
1c600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1c610 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1c620 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
1c630 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er,&pPager->jour
1c640 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20  nalOff,0,1,0);. 
1c650 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c670 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20    nPlayback++;. 
1c680 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c6a0 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1c6b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1c6c0 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
1c6d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c6e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1c6f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1c700 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1c710 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
1c730 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c   been truncated,
1c740 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61   simply stop rea
1c750 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20  ding and.       
1c760 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
1c770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68   the journal. Th
1c780 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20  is might happen 
1c790 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  if the journal w
1c7a0 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  as.          ** 
1c7b0 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77  not completely w
1c7c0 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65  ritten and synce
1c7d0 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61  d prior to a cra
1c7e0 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20  sh.  In that.   
1c7f0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20         ** case, 
1c800 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
1c810 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62  uld have never b
1c820 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74  een written in t
1c830 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
1c840 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69  first place so i
1c850 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c  t is OK to simpl
1c860 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f  y abandon the ro
1c870 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20  llback. */.     
1c880 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c890 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
1c8a0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c8b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c8c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1c8d0 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
1c8e0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74  o rollback, quit
1c8f0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1c900 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1c910 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77  ** code.  This w
1c920 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61  ill cause the pa
1c930 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
1c940 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20   error state.   
1c950 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61         ** so tha
1c960 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72  t no further har
1c970 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20  m will be done. 
1c980 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78   Perhaps the nex
1c990 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  t.          ** p
1c9a0 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
1c9b0 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c  long will be abl
1c9c0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  e to rollback th
1c9d0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
1c9e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1c9f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ca00 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
1ca10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ca20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
1ca30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
1ca40 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
1ca50 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20  .  /* Following 
1ca60 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20  a rollback, the 
1ca70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1ca80 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20  ould be back in 
1ca90 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  its original.  *
1caa0 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f  * state prior to
1cab0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1cac0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73  e transaction, s
1cad0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a  o invoke the.  *
1cae0 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
1caf0 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65  B_UNCHANGED file
1cb00 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  -control method 
1cb10 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20  to disable the. 
1cb20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68   ** assertion th
1cb30 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1cb40 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d  on counter was m
1cb50 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69  odified..  */.#i
1cb60 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1cb70 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  G.  if( pPager->
1cb80 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1cb90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
1cba0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
1cbb0 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46  ger->fd,SQLITE_F
1cbc0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
1cbd0 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  D,0);.  }.#endif
1cbe0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1cbf0 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70 65  layback is happe
1cc00 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c  ning automatical
1cc10 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ly as a result o
1cc20 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a  f an IO or .  **
1cc30 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68   malloc error th
1cc40 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74 65  at occurred afte
1cc50 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  r the change-cou
1cc60 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
1cc70 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72   but .  ** befor
1cc80 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
1cc90 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c  n was committed,
1cca0 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
1ccb0 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d  -counter .  ** m
1ccc0 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20  odification may 
1ccd0 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 72  just have been r
1cce0 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69 73  everted. If this
1ccf0 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c   happens in excl
1cd00 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65  usive .  ** mode
1cd10 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e  , then subsequen
1cd20 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70  t transactions p
1cd30 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20  erformed by the 
1cd40 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
1cd50 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20  not.  ** update 
1cd60 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cd70 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20  er at all. This 
1cd80 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68  may lead to cach
1cd90 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a  e inconsistency.
1cda0 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f    ** problems fo
1cdb0 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  r other processe
1cdc0 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  s at some point 
1cdd0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 53  in the future. S
1cde0 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20  o, just.  ** in 
1cdf0 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68 61  case this has ha
1ce00 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68  ppened, clear th
1ce10 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
1ce20 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f  e flag now..  */
1ce30 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
1ce40 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
1ce50 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a  ger->tempFile;..
1ce60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ce70 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74  _OK ){.    zMast
1ce80 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
1ce90 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d  pSpace;.    rc =
1cea0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1ceb0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1cec0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1ced0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1cee0 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+1);.    testca
1cef0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cf00 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cf10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20  c==SQLITE_OK.   
1cf20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
1cf30 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
1cf40 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
1cf50 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1cf60 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72  OPEN).  ){.    r
1cf70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cf80 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29 3b  Sync(pPager, 0);
1cf90 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cfa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cfb0 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
1cfc0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
1cfd0 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
1cfe0 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65 73  \0', 0);.    tes
1cff0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d000 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d020 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
1d030 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
1d040 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
1d050 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
1d060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1d070 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
1d080 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
1d090 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
1d0a0 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
1d0b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
1d0c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
1d0d0 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
1d0e0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1d0f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d100 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d110 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20 26   }.  if( isHot &
1d120 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20  & nPlayback ){. 
1d130 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
1d140 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
1d150 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22  OVER_ROLLBACK, "
1d160 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61 67  recovered %d pag
1d170 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20  es from %s",.   
1d180 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 6c               nPl
1d190 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e  ayback, pPager->
1d1a0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a  zJournal);.  }..
1d1b0 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
1d1c0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
1d1d0 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
1d1e0 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
1d1f0 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
1d200 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
1d210 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
1d220 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1d230 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
1d240 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
1d250 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
1d260 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
1d270 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
1d280 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1d290 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1d2a0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
1d2b0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
1d2c0 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
1d2d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d2e0 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
1d2f0 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
1d300 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
1d310 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
1d320 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
1d330 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
1d340 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d350 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1d360 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
1d370 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
1d380 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
1d390 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
1d3a0 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
1d3b0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
1d3c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1d3d0 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
1d3e0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
1d3f0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
1d400 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
1d410 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
1d420 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
1d430 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d440 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
1d450 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
1d460 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a 20  , u32 iFrame){. 
1d470 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d480 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
1d490 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73   Pager object as
1d4a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1d4b0 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f  ge pPg */.  Pgno
1d4c0 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e   pgno = pPg->pgn
1d4d0 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  o;       /* Page
1d4e0 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64 20   number to read 
1d4f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d500 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d510 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1d520 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
1d530 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d540 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  e; /* Number of 
1d550 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
1d560 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d570 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1d580 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d  R_READER && !MEM
1d590 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1d5a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1d5b0 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  d) );..#ifndef S
1d5c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d5d0 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1d5e0 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1d5f0 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1d600 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1d610 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1d620 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1d630 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1d640 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1d650 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d660 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1d670 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1d680 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1d690 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1d6a0 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
1d6b0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1d6c0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
1d6d0 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29  , pgsz, iOffset)
1d6e0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1d6f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d700 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1d710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d720 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d730 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1d740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1d750 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1d760 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1d770 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1d780 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1d790 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1d7a0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1d7b0 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1d7c0 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1d7d0 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1d7e0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1d7f0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1d800 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1d810 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1d820 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1d830 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1d840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1d850 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1d860 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1d870 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1d880 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1d890 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1d8a0 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1d8b0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1d8c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d8d0 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1d8e0 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1d8f0 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1d900 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1d910 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1d920 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1d930 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1d940 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1d950 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1d960 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1d970 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1d980 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1d990 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1d9a0 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1d9b0 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1d9c0 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1d9d0 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1d9e0 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1d9f0 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1da00 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1da10 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1da20 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1da30 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1da40 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1da50 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1da60 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1da70 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1da80 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1da90 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1daa0 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1dab0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1dac0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1dad0 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1dae0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1daf0 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
1db00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1db10 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f  BKPT);..  PAGER_
1db20 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1db30 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1db40 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1db50 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1db60 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1db70 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1db80 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  , pgno));.  PAGE
1db90 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1dba0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1dbb0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1dbc0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1dbd0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
1dbe0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1dbf0 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  g)));..  return 
1dc00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64  rc;.}../*.** Upd
1dc10 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ate the value of
1dc20 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1dc30 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32  ter at offsets 2
1dc40 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74  4 and 92 in.** t
1dc50 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  he header and th
1dc60 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e  e sqlite version
1dc70 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65   number at offse
1dc80 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  t 96..**.** This
1dc90 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69   is an unconditi
1dca0 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65  onal update.  Se
1dcb0 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72  e also the pager
1dcc0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1dcd0 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ter().** routine
1dce0 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61   which only upda
1dcf0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
1dd00 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70  ounter if the up
1dd10 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79  date is actually
1dd20 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64  .** needed, as d
1dd30 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1dd40 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
1dd50 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76  ountDone state v
1dd60 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1dd70 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72  ic void pager_wr
1dd80 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1dd90 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
1dda0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
1ddb0 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  ter;..  /* Incre
1ddc0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1ddd0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1dde0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1ddf0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1de00 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
1de10 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
1de20 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  *)pPg->pPager->d
1de30 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20  bFileVers)+1;.  
1de40 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1de50 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34  *)pPg->pData)+24
1de60 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1de70 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74  );..  /* Also st
1de80 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76  ore the SQLite v
1de90 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e  ersion number in
1dea0 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e   bytes 96..99 an
1deb0 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20  d in.  ** bytes 
1dec0 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65  92..95 store the
1ded0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1dee0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65  for which the ve
1def0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a  rsion number.  *
1df00 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  * is valid. */. 
1df10 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1df20 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39  r*)pPg->pData)+9
1df30 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  2, change_counte
1df40 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  r);.  put32bits(
1df50 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1df60 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56  ta)+96, SQLITE_V
1df70 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a  ERSION_NUMBER);.
1df80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1df90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1dfa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1dfb0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1dfc0 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1dfd0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1dfe0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1dff0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1e000 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1e010 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1e020 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1e030 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1e040 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1e050 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1e060 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1e070 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1e080 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1e090 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1e0a0 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1e0b0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1e0c0 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1e0d0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1e0e0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1e0f0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1e100 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1e110 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1e120 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1e130 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1e140 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1e150 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1e160 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1e170 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1e180 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1e190 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1e1a0 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1e1b0 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1e1c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1e1d0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1e1e0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1e1f0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1e200 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e210 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1e220 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1e230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e240 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e250 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1e260 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1e270 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1e280 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
1e290 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1e2a0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1e2b0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1e2c0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1e2d0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1e2e0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1e2f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e300 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1e310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e320 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20     u32 iFrame = 
1e330 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
1e340 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
1e350 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1e360 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61  pPg->pgno, &iFra
1e370 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
1e380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e390 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
1e3a0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
1e3b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1e3c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e3d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e3e0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1e3f0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1e400 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1e410 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1e420 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1e430 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1e440 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1e450 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1e460 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1e470 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1e480 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1e490 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1e4a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1e4b0 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1e4c0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1e4d0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1e4e0 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1e4f0 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1e500 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1e510 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1e520 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1e530 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1e540 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1e550 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1e560 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1e570 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1e580 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1e590 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1e5a0 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1e5b0 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1e5c0 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1e5d0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1e5e0 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1e5f0 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1e600 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1e610 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1e620 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1e630 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1e640 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e650 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e660 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1e670 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1e680 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1e690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1e6a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1e6b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e6c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1e6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1e6f0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e700 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1e710 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e720 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1e730 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1e740 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1e750 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1e760 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1e770 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1e780 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1e790 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1e7a0 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1e7b0 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1e7c0 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1e7d0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1e7e0 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1e7f0 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1e800 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1e810 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1e820 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1e830 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1e840 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1e850 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1e860 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1e870 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1e880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e890 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1e8a0 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1e8b0 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1e8c0 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1e8d0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1e8e0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1e8f0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1e900 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1e910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e920 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1e930 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1e940 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1e950 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1e960 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1e970 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1e980 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1e990 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1e9a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e9b0 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1e9c0 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1e9d0 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1e9e0 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1e9f0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1ea00 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1ea10 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1ea20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1ea30 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1ea40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1ea50 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1ea60 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1ea70 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1ea80 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1ea90 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1eaa0 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1eab0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1eac0 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1ead0 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1eae0 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1eaf0 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1eb00 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1eb10 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1eb20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1eb30 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1eb40 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1eb50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1eb60 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1eb70 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1eb80 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1eb90 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1eba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1ebb0 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1ebc0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1ebd0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1ebe0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1ebf0 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1ec00 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1ec10 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec30 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1ec40 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1ec50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1ec80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1ec90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eca0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ecb0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1ecc0 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1ecd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ece0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1ecf0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1ed00 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1ed10 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1ed20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1ed30 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1ed40 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1ed50 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1ed60 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1ed70 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1ed80 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1ed90 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1eda0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1edb0 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1edc0 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1edd0 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1ede0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1edf0 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1ee00 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1ee10 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1ee20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1ee30 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1ee40 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1ee50 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1ee60 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1ee70 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1ee80 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1ee90 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1eea0 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1eeb0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1eec0 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1eed0 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1eee0 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1eef0 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1ef00 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1ef10 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1ef20 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1ef30 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1ef40 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1ef50 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1ef60 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1ef70 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1ef80 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1ef90 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1efa0 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1efb0 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1efc0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1efd0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1efe0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1eff0 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1f000 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1f010 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1f020 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1f030 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1f040 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1f050 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1f060 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1f070 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1f080 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1f090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1f0a0 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1f0b0 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1f0c0 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1f0d0 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1f0e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f0f0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1f100 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1f110 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1f120 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1f130 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
1f140 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
1f150 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
1f160 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
1f170 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
1f180 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1f190 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
1f1a0 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
1f1b0 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
1f1c0 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
1f1d0 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
1f1e0 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
1f1f0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
1f200 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1f210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f220 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
1f230 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
1f240 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
1f250 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
1f260 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
1f270 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
1f280 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
1f290 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
1f2a0 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
1f2b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1f2c0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
1f2d0 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
1f2e0 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
1f2f0 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
1f300 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
1f310 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
1f320 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
1f330 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
1f340 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
1f350 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
1f360 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
1f370 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1f380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f390 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1f3c0 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
1f3d0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
1f3e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1f3f0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
1f400 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
1f410 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
1f420 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
1f430 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1f440 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
1f450 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1f460 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
1f470 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
1f480 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
1f490 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
1f4a0 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
1f4b0 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
1f4c0 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
1f4d0 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
1f4e0 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
1f4f0 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
1f500 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
1f510 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
1f520 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
1f530 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
1f540 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
1f550 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
1f560 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
1f570 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f580 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f590 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
1f5a0 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
1f5b0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
1f5c0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
1f5d0 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
1f5e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
1f5f0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
1f600 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1f610 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
1f620 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
1f630 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
1f640 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
1f650 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f660 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f670 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f680 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
1f690 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1f6a0 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
1f6b0 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
1f6c0 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
1f6d0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
1f6e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1f6f0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
1f700 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
1f710 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
1f720 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
1f730 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
1f740 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
1f750 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
1f760 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1f770 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
1f780 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
1f790 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
1f7a0 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
1f7b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
1f7c0 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
1f7d0 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
1f7e0 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
1f7f0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
1f800 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
1f810 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
1f820 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
1f830 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
1f840 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
1f850 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f870 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1f880 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
1f890 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
1f8a0 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
1f8b0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
1f8c0 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
1f8d0 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
1f8e0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f8f0 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
1f900 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
1f910 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
1f920 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
1f930 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1f940 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
1f950 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
1f960 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
1f970 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1f980 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
1f990 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
1f9a0 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
1f9b0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
1f9c0 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
1f9d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
1f9e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1f9f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1fa00 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1fa10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1fa20 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1fa30 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c  );.  nPage = sql
1fa40 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1fa50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
1fa60 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  /* If the number
1fa70 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1fa80 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1fa90 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
1faa0 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62  the.  ** WAL sub
1fab0 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69  -system, determi
1fac0 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e  ne the page coun
1fad0 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  te based on the 
1fae0 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
1faf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fb00 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
1fb10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fb20 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a  e is not an.  **
1fb30 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
1fb40 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
1fb50 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65  ze, round up the
1fb60 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
1fb70 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1fb80 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
1fbb0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
1fbc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
1fbd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1fbe0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1fbf0 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
1fc00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1fc10 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  ) ){.      int r
1fc20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1fc30 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
1fc40 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  , &n);.      if(
1fc50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fc60 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1fc70 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1fc80 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28   }.    nPage = (
1fc90 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d  Pgno)((n+pPager-
1fca0 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70  >pageSize-1) / p
1fcb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fcc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1fcd0 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65  he current numbe
1fce0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
1fcf0 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65  e file is greate
1fd00 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20  r than the.  ** 
1fd10 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
1fd20 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
1fd30 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
1fd40 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
1fd50 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
1fd60 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
1fd70 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
1fd80 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1fd90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
1fda0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
1fdb0 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61  ge;.  }..  *pnPa
1fdc0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1fdd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fde0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1fdf0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1fe00 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d   Check if the *-
1fe10 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f  wal file that co
1fe20 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
1fe30 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1fe40 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78   by pPager.** ex
1fe50 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74 61  ists if the data
1fe60 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79  base is not empy
1fe70 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61 74  , or verify that
1fe80 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fe90 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
1fea0 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69  t (by deleting i
1feb0 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62 61  t) if the databa
1fec0 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  se file is empty
1fed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1fee0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65  atabase is not e
1fef0 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77  mpty and the *-w
1ff00 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
1ff10 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  open the pager.*
1ff20 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20  * in WAL mode.  
1ff30 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1ff40 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e  is empty or if n
1ff50 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69  o *-wal file exi
1ff60 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f  sts and.** if no
1ff70 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d   error occurs, m
1ff80 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a  ake sure Pager.j
1ff90 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f  ournalMode is no
1ffa0 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45  t set to.** PAGE
1ffb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1ffc0 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
1ffd0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20  SQLITE_OK or an 
1ffe0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1fff0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
20000 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20  t hold a SHARED 
20010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20020 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c  base file to cal
20030 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  l this.** functi
20040 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45  on. Because an E
20050 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
20060 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73 20   the db file is 
20070 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65  required to dele
20080 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20  te .** a WAL on 
20090 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74  a none-empty dat
200a0 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75  abase, this ensu
200b0 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  res there is no 
200c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  race condition .
200d0 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 78  ** between the x
200e0 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61  Access() below a
200f0 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20  nd an xDelete() 
20100 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20 62  being executed b
20110 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72  y some .** other
20120 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20130 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20140 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
20150 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20160 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20170 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
20180 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20190 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
201a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
201b0 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
201c0 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  OCK );..  if( !p
201d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
201e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c  ){.    int isWal
201f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20200 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
20210 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20  WAL file exists 
20220 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  */.    Pgno nPag
20230 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20240 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
20250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20260 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70  e */..    rc = p
20270 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20280 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
20290 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
202a0 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e  rn rc;.    if( n
202b0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
202c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
202d0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
202e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
202f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
20300 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
20310 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20  _DELETE_NOENT ) 
20320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20330 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b        isWal = 0;
20340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20360 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20  Access(.        
20370 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20    pPager->pVfs, 
20380 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51  pPager->zWal, SQ
20390 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
203a0 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20  TS, &isWal.     
203b0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
203c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
203d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 57  ){.      if( isW
203e0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  al ){.        te
203f0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50  stcase( sqlite3P
20400 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
20410 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
20420 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
20430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
20440 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30  penWal(pPager, 0
20450 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
20460 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
20470 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
20480 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b  URNALMODE_WAL ){
20490 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
204a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
204b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
204c0 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  _DELETE;.      }
204d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
204e0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
204f0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
20500 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65   savepoint pSave
20510 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53  point. Or, if pS
20520 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20  avepoint==NULL, 
20530 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a  then playback.**
20540 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
20550 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
20560 20 54 68 65 20 63 61 73 65 20 70 53 61 76 65 70   The case pSavep
20570 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72  oint==NULL occur
20580 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c  s when .** a ROL
20590 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64  LBACK TO command
205a0 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61   is invoked on a
205b0 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20   SAVEPOINT that 
205c0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
205d0 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a   .** savepoint..
205e0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65  **.** When pSave
205f0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  point is not NUL
20600 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e  L (meaning a non
20610 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76  -transaction sav
20620 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65  epoint is .** be
20630 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29  ing rolled back)
20640 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
20650 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ack consists of 
20660 75 70 20 74 6f 20 74 68 72 65 65 20 73 74 61 67  up to three stag
20670 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64  es,.** performed
20680 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70   in the order sp
20690 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  ecified:.**.**  
206a0 20 2a 20 50 61 67 65 73 20 61 72 65 20 70 6c 61   * Pages are pla
206b0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
206c0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
206d0 74 61 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a  tarting at byte.
206e0 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20 50 61  **     offset Pa
206f0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
20700 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
20710 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50  ing to .**     P
20720 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20730 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20  drOffset, or to 
20740 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
20750 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ain journal.**  
20760 20 20 20 66 69 6c 65 20 69 66 20 50 61 67 65 72     file if Pager
20770 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20780 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a  fset is zero..**
20790 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72  .**   * If Pager
207a0 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
207b0 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  fset is not zero
207c0 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
207d0 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62   played.**     b
207e0 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f  ack starting fro
207f0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
20800 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  ader immediately
20810 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20   following .**  
20820 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20830 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20  t.iHdrOffset to 
20840 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
20850 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
20860 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65  ..**.**   * Page
20870 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65  s are then playe
20880 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
20890 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
208a0 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20  , starting.**   
208b0 20 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72    with the Pager
208c0 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65  Savepoint.iSubRe
208d0 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  c and continuing
208e0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a   to the end of.*
208f0 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
20900 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  l file..**.** Th
20910 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c  roughout the rol
20920 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65  lback process, e
20930 61 63 68 20 74 69 6d 65 20 61 20 70 61 67 65 20  ach time a page 
20940 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
20950 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
20960 64 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20  ding bit is set 
20970 69 6e 20 61 20 62 69 74 76 65 63 20 73 74 72 75  in a bitvec stru
20980 63 74 75 72 65 20 28 76 61 72 69 61 62 6c 65 20  cture (variable 
20990 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20  pDone in the.** 
209a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62  implementation b
209b0 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75  elow). This is u
209c0 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
209d0 61 74 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c  at a page is onl
209e0 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y.** rolled back
209f0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
20a00 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  it is encountere
20a10 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72  d in either jour
20a20 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53  nal..**.** If pS
20a30 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c  avepoint is NULL
20a40 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61 72 65  , then pages are
20a50 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63   only played bac
20a60 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a  k from the main.
20a70 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
20a80 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
20a90 64 20 66 6f 72 20 61 20 62 69 74 76 65 63 20 69  d for a bitvec i
20aa0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
20ab0 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ** In either cas
20ac0 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61  e, before playba
20ad0 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65  ck commences the
20ae0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61   Pager.dbSize va
20af0 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73  riable.** is res
20b00 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
20b10 74 68 61 74 20 69 74 20 68 65 6c 64 20 61 74 20  that it held at 
20b20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
20b30 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28   savepoint .** (
20b40 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  or transaction).
20b50 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20 61 20   No page with a 
20b60 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61  page-number grea
20b70 74 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ter than this va
20b80 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64  lue.** is played
20b90 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73   back. If one is
20ba0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20   encountered it 
20bb0 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65  is simply skippe
20bc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20bd0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
20be0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
20bf0 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
20c00 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
20c10 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c30 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a 65  * Effective size
20c40 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
20c50 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
20c60 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
20c70 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72     /* End of fir
20c80 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61  st segment of ma
20c90 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  in-journal recor
20ca0 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ds */.  int rc =
20cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
20cc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20cd0 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
20ce0 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ne = 0;       /*
20cf0 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72   Bitvec to ensur
20d00 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62  e pages played b
20d10 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f  ack only once */
20d20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20d30 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
20d40 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
20d50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20d60 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
20d70 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f  R_LOCKED );..  /
20d80 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74  * Allocate a bit
20d90 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74  vec to use to st
20da0 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20 70  ore the set of p
20db0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
20dc0 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
20dd0 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e  oint ){.    pDon
20de0 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  e = sqlite3Bitve
20df0 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f 69  cCreate(pSavepoi
20e00 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20  nt->nOrig);.    
20e10 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20  if( !pDone ){.  
20e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20e30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
20e40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65    }.  }..  /* Se
20e50 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  t the database s
20e60 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
20e70 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66  value it was bef
20e80 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e  ore the savepoin
20e90 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65  t .  ** being re
20ea0 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
20eb0 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
20ec0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
20ed0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
20ee0 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
20ef0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
20f00 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
20f10 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67  CountDone = pPag
20f20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20  er->tempFile;.. 
20f30 20 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74   if( !pSavepoint
20f40 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
20f50 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
20f60 65 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62  eturn pagerRollb
20f70 61 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a  ackWal(pPager);.
20f80 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50    }..  /* Use pP
20f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20fa0 20 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76   as the effectiv
20fb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61  e size of the ma
20fc0 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  in rollback.  **
20fd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61   journal.  The a
20fe0 63 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74  ctual file might
20ff0 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
21000 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47  this in.  ** PAG
21010 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
21020 52 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52  RUNCATE or PAGER
21030 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
21040 53 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68  SIST.  But anyth
21050 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50  ing.  ** past pP
21060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21070 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74   is off-limits t
21080 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a  o us..  */.  szJ
21090 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
210a0 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  alOff;.  assert(
210b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
210c0 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d  ger)==0 || szJ==
210d0 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  0 );..  /* Begin
210e0 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
210f0 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
21100 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
21110 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
21120 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
21130 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
21140 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
21150 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
21160 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
21170 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
21180 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21190 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
211a0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
211b0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
211c0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
211d0 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
211e0 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
211f0 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21200 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
21210 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
21220 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
21230 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
21240 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
21250 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21260 6e 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57  nt && !pagerUseW
21270 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21280 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76    iHdrOff = pSav
21290 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
212a0 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  et ? pSavepoint-
212b0 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a  >iHdrOffset : sz
212c0 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  J;.    pPager->j
212d0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76  ournalOff = pSav
212e0 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b  epoint->iOffset;
212f0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
21300 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
21310 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
21320 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20  iHdrOff ){.     
21330 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
21340 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
21350 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
21360 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
21370 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
21380 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
21390 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
213a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
213b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
213c0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e  0;.  }..  /* Con
213d0 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61  tinue rolling ba
213e0 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f  ck records out o
213f0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
21400 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
21410 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f   ** the first jo
21420 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65  urnal header see
21430 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  n and continuing
21440 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63   until the effec
21450 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  tive end.  ** of
21460 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21470 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75  l file.  Continu
21480 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66  e to skip out-of
21490 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64  -range pages and
214a0 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  .  ** continue a
214b0 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c  dding pages roll
214c0 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65  ed back to pDone
214d0 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
214e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
214f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21500 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75  Off<szJ ){.    u
21510 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
21520 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21530 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52  r */.    u32 nJR
21540 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  ec = 0;     /* N
21550 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
21560 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
21570 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
21580 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
21590 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a  dr(pPager, 0, sz
215a0 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
215b0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
215c0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
215d0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  );..    /*.    *
215e0 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a  * The "pPager->j
215f0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
21600 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
21610 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
21620 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73  lOff".    ** tes
21630 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20  t is related to 
21640 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53  ticket #2565.  S
21650 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f  ee the discussio
21660 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  n in the.    ** 
21670 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
21680 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64   function for ad
21690 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
216a0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
216b0 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
216c0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
216d0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
216e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
216f0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
21700 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
21710 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28    nJRec = (u32)(
21720 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
21730 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
21740 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
21750 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
21760 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
21770 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
21780 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21790 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
217a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
217b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
217c0 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
217d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
217e0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
217f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21800 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21810 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  NE );.  }.  asse
21820 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
21830 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
21840 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a  rnalOff>=szJ );.
21850 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20  .  /* Finally,  
21860 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66  rollback pages f
21870 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
21880 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20  nal.  Page that 
21890 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f  were.  ** previo
218a0 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  usly rolled back
218b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e   out of the main
218c0 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72   journal (and ar
218d0 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65  e hence in pDone
218e0 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73  ).  ** will be s
218f0 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d  kipped.  Out-of-
21900 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20  range pages are 
21910 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20  also skipped..  
21920 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
21930 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69  int ){.    u32 i
21940 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
21950 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21960 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20  .    i64 offset 
21970 3d 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e  = (i64)pSavepoin
21980 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50  t->iSubRec*(4+pP
21990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
219a0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
219b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
219c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
219d0 74 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55  te3WalSavepointU
219e0 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
219f0 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57  , pSavepoint->aW
21a00 61 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  alData);.    }. 
21a10 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70     for(ii=pSavep
21a20 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72  oint->iSubRec; r
21a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21a40 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  ii<pPager->nSubR
21a50 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
21a60 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d   assert( offset=
21a70 3d 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67  =(i64)ii*(4+pPag
21a80 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b  er->pageSize) );
21a90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21aa0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
21ab0 61 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66  age(pPager, &off
21ac0 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31  set, pDone, 0, 1
21ad0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
21ae0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21af0 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73  DONE );.  }..  s
21b00 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
21b10 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
21b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21b30 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
21b40 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
21b50 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
21b60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
21b70 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
21b80 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
21b90 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
21ba0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
21bb0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
21bc0 6f 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20  o recycle clean 
21bd0 61 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73  and unused pages
21be0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21bf0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
21c00 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21c10 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
21c20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
21c30 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
21c40 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
21c50 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ge);.}../*.** Ch
21c60 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
21c70 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
21c80 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
21c90 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62  are allowed.** b
21ca0 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
21cb0 20 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20   to spill pages 
21cc0 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69  to journal..*/.i
21cd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
21ce0 65 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65  etSpillsize(Page
21cf0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
21d00 78 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  xPage){.  return
21d10 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
21d20 74 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65  tSpillsize(pPage
21d30 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
21d40 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ge);.}../*.** In
21d50 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  voke SQLITE_FCNT
21d60 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65  L_MMAP_SIZE base
21d70 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
21d80 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70   value of szMmap
21d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21da0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
21db0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
21dc0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
21dd0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73  _MMAP_SIZE>0.  s
21de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
21df0 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20  = pPager->fd;.  
21e00 69 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26  if( isOpen(fd) &
21e10 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  & fd->pMethods->
21e20 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20  iVersion>=3 ){. 
21e30 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
21e40 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50   sz;.    sz = pP
21e50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20  ager->szMmap;.  
21e60 20 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65    pPager->bUseFe
21e70 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20  tch = (sz>0);.  
21e80 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
21e90 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
21ea0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
21eb0 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
21ec0 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
21ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
21ee0 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
21ef0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
21f00 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
21f10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21f30 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
21f40 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21f50 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
21f60 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
21f70 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
21f80 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
21f90 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
21fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
21fb0 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
21fc0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
21fd0 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
21fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
21ff0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
22000 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
22010 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
22020 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
22030 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
22040 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22050 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22060 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22070 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22080 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22090 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
220a0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
220b0 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
220c0 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
220d0 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
220e0 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
220f0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
22100 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
22110 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
22120 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
22130 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
22140 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
22150 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76  ere are four lev
22160 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
22170 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
22180 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
22190 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
221a0 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
221c0 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
221d0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
221e0 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
221f0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22200 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
22210 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
22220 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
22230 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
22240 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
22250 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
22260 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
22270 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
22280 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
22290 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
222a0 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
222b0 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
222c0 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
222d0 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
222e0 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
222f0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
22300 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
22310 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
22320 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
22330 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
22340 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22350 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
22360 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
22370 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
22380 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
22390 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
223a0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
223b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
223c0 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
223d0 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
223e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
223f0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
22410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
22420 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
22430 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
22440 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
22450 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
22460 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
22470 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
22480 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
22490 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
224a0 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
224b0 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
224c0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
224d0 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
224e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
224f0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
22500 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
22510 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
22520 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
22530 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22540 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
22550 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52  k..**.**    EXTR
22560 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69  A     This is li
22570 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74  ke FULL except t
22580 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63  hat is also sync
22590 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  s the directory.
225a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
225b0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
225c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
225d0 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  al after the rol
225e0 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20  lback.**        
225f0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73        journal is
22600 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a   unlinked..**.**
22610 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
22620 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
22630 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
22640 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
22650 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
22660 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
22670 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
22680 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
22690 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
226a0 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
226b0 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
226c0 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
226d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
226e0 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
226f0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
22700 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
22710 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
22720 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
22730 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
22740 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
22750 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
22760 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
22770 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
22780 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
22790 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
227a0 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
227b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
227c0 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
227d0 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
227e0 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
227f0 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
22800 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
22810 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
22820 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72  th NORMAL.  Ther
22830 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
22840 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a  ce between FULL.
22850 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72  ** and EXTRA for
22860 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
22870 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
22880 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
22890 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
228a0 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
228b0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
228c0 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
228d0 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
228e0 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
228f0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
22900 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
22910 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22920 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
22930 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
22940 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
22950 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
22960 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
22970 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
22980 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
22990 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
229a0 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
229b0 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
229c0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
229d0 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
229e0 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
229f0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
22a00 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
22a10 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
22a20 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
22a30 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
22a40 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
22a50 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
22a60 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
22a70 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
22a80 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
22a90 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
22aa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22ab0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
22ac0 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
22ad0 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
22ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
22af0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
22b00 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
22b10 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
22b20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
22b30 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
22b40 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
22b50 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
22b60 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22b70 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
22b80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
22b90 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
22ba0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
22bb0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
22bc0 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
22bd0 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
22be0 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
22bf0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
22c00 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
22c10 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22c20 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
22c30 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22c40 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
22c50 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
22c60 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
22c70 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
22c80 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
22c90 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
22ca0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
22cb0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
22cc0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22cd0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 50  lags = 0;.    pP
22ce0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22cf0 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ags = 0;.  }else
22d00 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
22d10 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20 29  AGER_FULLFSYNC )
22d20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22d30 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22d40 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 20 20  _SYNC_FULL;.    
22d50 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
22d60 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
22d70 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73  YNC_FULL;.  }els
22d80 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
22d90 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46  PAGER_CKPT_FULLF
22da0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
22db0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22dc0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
22dd0 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  AL;.    pPager->
22de0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20  ckptSyncFlags = 
22df0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
22e00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22e10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22e20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22e30 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
22e40 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
22e50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
22e60 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
22e70 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
22e80 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  s = pPager->sync
22e90 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61  Flags;.  if( pPa
22ea0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
22eb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
22ec0 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57 41 4c  SyncFlags |= WAL
22ed0 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f  _SYNC_TRANSACTIO
22ee0 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NS;.  }.  if( pg
22ef0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
22f00 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
22f10 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
22f20 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
22f30 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
22f40 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
22f50 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
22f60 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
22f70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
22f80 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
22f90 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
22fa0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
22fb0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
22fc0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
22fd0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
22fe0 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
22ff0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23000 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
23010 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
23020 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
23030 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
23040 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
23050 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
23060 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
23070 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
23080 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
23090 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
230a0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
230b0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
230c0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
230d0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
230e0 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
230f0 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
23100 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
23110 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
23120 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
23130 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
23140 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
23150 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
23160 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
23170 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
23180 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
23190 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
231a0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
231b0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
231c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
231d0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
231e0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
231f0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23200 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
23210 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
23220 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
23230 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
23240 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
23250 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23260 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
23270 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
23280 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
23290 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
232a0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
232b0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
232c0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
232d0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
232e0 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
232f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23310 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23320 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23330 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
23340 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
23350 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
23360 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
23370 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
23380 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
23390 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
233a0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
233b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
233c0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
233d0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
233e0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
233f0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
23400 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
23410 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
23420 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
23430 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
23440 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
23450 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
23460 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
23470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
23480 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
23490 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
234a0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
234b0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
234c0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
234d0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
234e0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
234f0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
23500 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
23510 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
23520 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
23530 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
23540 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
23550 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
23560 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
23570 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
23580 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
23590 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
235a0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
235b0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
235c0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
235d0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
235e0 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
235f0 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
23600 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
23610 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
23620 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
23630 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
23650 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
23660 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
23670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
236a0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
236b0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
236c0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
236d0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
236e0 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
236f0 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
23700 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
23710 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
23720 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
23730 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
23740 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
23750 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
23760 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
23770 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
23780 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
23790 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
237a0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
237b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
237c0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
237d0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
237e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
237f0 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
23800 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
23810 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
23820 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
23830 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
23860 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
23870 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
23880 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
23890 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
238a0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
238b0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
238c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
238d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
238e0 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
238f0 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
23900 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
23910 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
23920 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23930 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
23940 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
23950 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
23960 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
23970 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
23980 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
23990 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
239a0 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
239b0 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
239c0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
239d0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
239e0 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
239f0 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
23a00 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
23a10 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
23a20 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
23a30 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
23a40 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
23a50 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
23a60 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
23a70 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
23a80 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
23a90 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
23aa0 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
23ab0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
23ac0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
23ad0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
23ae0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
23af0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23b00 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
23b10 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
23b20 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
23b30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
23b40 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
23b50 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
23b60 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
23b70 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
23b80 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
23b90 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
23ba0 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
23bb0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23bc0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
23bd0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
23be0 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
23bf0 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
23c00 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
23c10 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
23c20 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
23c30 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
23c40 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
23c50 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
23c60 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
23c70 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
23c80 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
23c90 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
23ca0 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
23cb0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
23cc0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
23cd0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
23ce0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
23cf0 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
23d00 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
23d10 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
23d20 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
23d30 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
23d40 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
23d50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
23d60 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
23d70 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
23d80 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
23d90 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
23da0 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
23db0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
23dc0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
23dd0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
23de0 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
23df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
23e00 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
23e10 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
23e20 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
23e30 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
23e40 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
23e50 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
23e60 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
23e70 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
23e80 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
23e90 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
23ea0 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
23eb0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
23ec0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
23ed0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
23ee0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
23ef0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
23f00 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
23f10 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
23f20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23f30 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
23f40 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
23f50 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
23f60 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
23f70 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
23f80 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
23f90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
23fa0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
23fb0 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
23fc0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
23fd0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
23fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
23ff0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
24000 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
24010 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
24020 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
24030 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
24040 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
24050 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
24060 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
24070 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
24080 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
24090 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
240a0 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
240b0 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
240c0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
240d0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
240e0 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
240f0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
24100 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
24110 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
24120 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
24130 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
24140 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
24150 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
24160 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24170 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
24180 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
24190 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
241a0 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
241b0 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
241c0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
241d0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
241e0 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
241f0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
24200 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
24210 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
24220 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
24230 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
24240 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
24250 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
24260 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
24270 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
24280 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
24290 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
242a0 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
242b0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
242c0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
242d0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
242e0 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
242f0 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
24300 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
24310 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
24320 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24330 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
24340 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24350 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
24360 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
24370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
24390 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
243a0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
243b0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
243c0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
243d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
243e0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
243f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24400 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
24410 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
24420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24430 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
24440 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
24450 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
24460 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24470 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24480 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
24490 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
244a0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
244b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
244c0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
244d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
244e0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
244f0 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
24500 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
24510 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
24520 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
24530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
24540 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
24550 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
24560 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
24570 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
24580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24590 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
245a0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
245b0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
245c0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
245d0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
245e0 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
245f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
24600 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
24610 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
24620 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
24630 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
24640 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
24650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24670 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
24680 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
24690 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
246a0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
246b0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
246c0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
246d0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
246e0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
246f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
24700 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
24710 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
24720 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
24730 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
24740 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
24750 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
24760 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
24770 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
24780 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
24790 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
247a0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
247b0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
247c0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
247d0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
247e0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
247f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
24800 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
24810 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
24820 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24830 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
24840 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
24850 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
24860 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
24870 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
24880 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
24890 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
248a0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
248b0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
248c0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
248d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
248e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
248f0 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
24900 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
24910 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
24920 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
24930 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
24940 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
24950 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
24960 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
24970 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
24980 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
24990 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
249a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
249b0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
249c0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
249d0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
249e0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
249f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24a00 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
24a10 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
24a20 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
24a30 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
24a40 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24a50 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
24a60 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
24a70 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
24a80 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
24a90 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
24aa0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
24ab0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
24ac0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
24ad0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
24ae0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
24af0 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
24b00 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24b10 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
24b20 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
24b30 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
24b40 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
24b50 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
24b60 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
24b70 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
24b80 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
24b90 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
24ba0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24bb0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
24bc0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
24bd0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
24be0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
24bf0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
24c00 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
24c10 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
24c20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
24c30 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
24c40 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
24c50 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
24c60 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
24c70 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
24c80 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
24c90 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
24ca0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
24cb0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
24cc0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
24cd0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
24ce0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
24cf0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24d00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
24d10 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
24d20 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
24d30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
24d40 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
24d50 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
24d60 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
24d70 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
24d80 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
24d90 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
24da0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
24db0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
24dc0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
24dd0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
24de0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
24df0 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
24e00 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24e10 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
24e20 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
24e30 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
24e40 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24e50 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
24e60 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
24e70 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
24e80 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
24e90 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
24ea0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
24eb0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
24ec0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
24ed0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
24ee0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
24ef0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
24f00 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
24f10 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
24f20 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
24f30 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
24f40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
24f50 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
24f60 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
24f70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
24f80 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
24f90 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
24fa0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
24fb0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
24fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24fd0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
24fe0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
24ff0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
25000 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
25010 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
25020 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
25030 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
25040 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
25050 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
25060 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
25070 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
25080 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
25090 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
250a0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
250b0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
250c0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
250d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
250e0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
250f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25100 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
25110 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
25120 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
25130 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
25140 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
25150 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
25160 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
25170 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
25180 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
25190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
251a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
251b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
251c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
251d0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
251e0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
251f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
25200 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
25210 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
25220 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
25230 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
25240 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25250 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
25260 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
25270 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
25280 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
25290 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
252a0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
252b0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
252c0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
252d0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
252e0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
252f0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25300 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25310 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
25320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25330 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
25340 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
25350 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
25360 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
25370 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
25380 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
25390 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
253a0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
253b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
253c0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
253d0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
253e0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
253f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
25400 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
25410 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
25420 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
25430 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
25440 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
25450 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
25460 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
25470 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
25480 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
25490 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
254a0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
254b0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
254c0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
254d0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
254e0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
254f0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
25500 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
25510 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
25520 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
25530 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
25540 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25550 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
25560 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
25570 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
25580 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
25590 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
255a0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
255b0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
255c0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
255d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
255e0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
255f0 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
25600 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
25610 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25640 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
25650 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
25660 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
25670 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
25680 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
25690 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
256a0 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
256b0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
256c0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
256d0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
256e0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
256f0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
25700 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
25710 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
25720 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
25730 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
25740 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
25750 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
25760 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25770 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
25780 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
25790 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
257a0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
257b0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
257c0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
257d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
257e0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
257f0 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
25800 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
25810 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
25820 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
25830 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
25840 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
25850 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
25860 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
25870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
25880 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
25890 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
258a0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
258b0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
258c0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
258d0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
258e0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
258f0 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
25900 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
25910 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
25920 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
25930 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
25940 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
25950 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
25960 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
25970 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
25980 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
25990 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
259a0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
259b0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
259c0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
259d0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
259e0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
259f0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
25a00 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
25a10 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
25a20 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
25a30 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
25a40 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
25a50 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
25a60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
25a70 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
25a80 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
25a90 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
25aa0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
25ab0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
25ac0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
25ad0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
25ae0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
25af0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25b00 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
25b10 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
25b20 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
25b30 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
25b40 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
25b50 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
25b60 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
25b70 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
25b80 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
25b90 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
25ba0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
25bb0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
25bc0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
25bd0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
25be0 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
25bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25c00 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
25c10 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
25c20 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
25c30 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
25c40 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
25c50 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
25c60 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
25c70 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25c80 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
25c90 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
25ca0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
25cb0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
25cc0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
25cd0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
25ce0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
25cf0 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
25d00 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25d10 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25d20 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
25d30 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
25d40 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
25d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
25d60 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
25d70 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
25d80 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
25d90 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
25da0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
25db0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
25dc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25dd0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
25de0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
25df0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
25e00 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25e10 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
25e20 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
25e30 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25e40 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
25e50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
25e60 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
25e70 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
25e80 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
25e90 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
25ea0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
25eb0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
25ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25ed0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
25ee0 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
25ef0 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
25f00 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
25f10 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
25f20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
25f30 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
25f40 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
25f50 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
25f60 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
25f70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
25f80 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
25f90 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
25fa0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
25fb0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
25fc0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
25fd0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
25fe0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
25ff0 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
26000 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
26010 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
26020 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
26030 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
26040 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
26050 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
26060 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
26070 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
26080 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
26090 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
260a0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
260b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
260c0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
260d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
260e0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
260f0 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
26100 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
26110 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
26120 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
26130 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
26140 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26150 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
26160 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
26170 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
26180 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
26190 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
261a0 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
261b0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
261c0 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
261d0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
261e0 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
261f0 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
26200 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
26210 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
26220 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
26230 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
26240 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
26250 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
26260 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
26270 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
26280 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26290 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
262a0 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
262b0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
262c0 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
262d0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
262e0 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
262f0 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
26300 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
26310 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
26320 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
26330 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
26340 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
26350 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
26360 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26370 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26380 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
26390 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
263a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
263b0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
263c0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
263d0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
263e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
263f0 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
26400 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26410 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
26420 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
26430 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
26440 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
26450 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
26460 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
26470 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
26480 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
26490 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
264a0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
264b0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
264c0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
264d0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
264e0 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
264f0 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
26500 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
26510 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
26520 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
26530 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
26540 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
26550 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
26560 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
26570 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
26580 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
26590 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
265a0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
265b0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
265c0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
265d0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
265e0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
265f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
26600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26610 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
26620 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
26630 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
26640 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
26650 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
26660 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
26670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26680 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
26690 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
266a0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
266b0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
266c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
266d0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72 65  *.** Obtain a re
266e0 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d  ference to a mem
266f0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
26700 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65 20  object for page 
26710 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a  number pgno. .**
26720 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
26730 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f 69  will use the poi
26740 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74 61  nter pData, obta
26750 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63 68  ined from xFetch
26760 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  ()..** If succes
26770 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61 67  sful, set *ppPag
26780 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
26790 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65 72  e new page refer
267a0 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75  ence.** and retu
267b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74  rn SQLITE_OK. Ot
267c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
267d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
267e0 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20  code and set.** 
267f0 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e  *ppPage to zero.
26800 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66 65  .**.** Page refe
26810 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64 20  rences obtained 
26820 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
26830 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26840 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62  be released.** b
26850 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72 52  y calling pagerR
26860 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29 2e  eleaseMapPage().
26870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
26880 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61  agerAcquireMapPa
26890 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
268a0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
268b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
268c0 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  bject */.  Pgno 
268d0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
268e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
268f0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76  ge number */.  v
26900 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20  oid *pData,     
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26920 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61 74  * xFetch()'d dat
26930 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  a for this page 
26940 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  */.  PgHdr **ppP
26950 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20 20  age             
26960 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71       /* OUT: Acq
26970 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65 63  uired page objec
26980 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  t */.){.  PgHdr 
26990 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
269a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
269b0 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65 20  ory mapped page 
269c0 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a  to return */.  .
269d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 4d    if( pPager->pM
269e0 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a 20  mapFreelist ){. 
269f0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
26a00 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26a10 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61 67  eelist;.    pPag
26a20 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26a30 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
26a40 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
26a50 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e  ;.    memset(p->
26a60 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67 65  pExtra, 0, pPage
26a70 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65  r->nExtra);.  }e
26a80 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
26a90 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29   = p = (PgHdr *)
26aa0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
26ab0 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20  o(sizeof(PgHdr) 
26ac0 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
26ad0 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20  );.    if( p==0 
26ae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26af0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26b00 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f  ->fd, (i64)(pgno
26b10 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61  -1) * pPager->pa
26b20 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a  geSize, pData);.
26b30 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26b40 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
26b50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78      }.    p->pEx
26b60 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70  tra = (void *)&p
26b70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  [1];.    p->flag
26b80 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a  s = PGHDR_MMAP;.
26b90 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b      p->nRef = 1;
26ba0 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d  .    p->pPager =
26bb0 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20   pPager;.  }..  
26bc0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72  assert( p->pExtr
26bd0 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d  a==(void *)&p[1]
26be0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
26bf0 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61  >pPage==0 );.  a
26c00 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d  ssert( p->flags=
26c10 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20  =PGHDR_MMAP );. 
26c20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67   assert( p->pPag
26c30 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
26c40 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d  assert( p->nRef=
26c50 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f  =1 );..  p->pgno
26c60 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44   = pgno;.  p->pD
26c70 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70  ata = pData;.  p
26c80 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b  Pager->nMmapOut+
26c90 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  +;..  return SQL
26ca0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26cb0 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
26cc0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67  ence to page pPg
26cd0 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20  . pPg must have 
26ce0 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79  been returned by
26cf0 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20   an .** earlier 
26d00 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71  call to pagerAcq
26d10 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a  uireMapPage()..*
26d20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26d30 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26d40 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26d50 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
26d60 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
26d70 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
26d80 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74  --;.  pPg->pDirt
26d90 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  y = pPager->pMma
26da0 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61  pFreelist;.  pPa
26db0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26dc0 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73  st = pPg;..  ass
26dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d  ert( pPager->fd-
26de0 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
26df0 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69  ion>=3 );.  sqli
26e00 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26e10 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26e20 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67  Pg->pgno-1)*pPag
26e30 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
26e40 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a  g->pData);.}../*
26e50 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48  .** Free all PgH
26e60 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65  dr objects store
26e70 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70  d in the Pager.p
26e80 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73  MmapFreelist lis
26e90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
26ea0 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64  d pagerFreeMapHd
26eb0 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  rs(Pager *pPager
26ec0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
26ed0 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20   PgHdr *pNext;. 
26ee0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
26ef0 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b  MmapFreelist; p;
26f00 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
26f10 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  Next = p->pDirty
26f20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
26f30 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(p);.  }.}.../
26f40 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
26f50 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
26f60 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
26f70 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
26f80 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
26f90 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
26fa0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
26fb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
26fc0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
26fd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
26fe0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
26ff0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
27000 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
27010 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
27020 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
27030 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
27040 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
27050 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
27060 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
27070 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
27080 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
27090 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
270a0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
270b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
270c0 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
270d0 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
270e0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
270f0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
27100 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
27110 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
27120 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
27130 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
27140 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
27150 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
27160 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
27170 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
27180 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
27190 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
271a0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
271b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
271c0 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28  {.  u8 *pTmp = (
271d0 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
271e0 70 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72  pSpace;..  asser
271f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
27200 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
27210 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
27220 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
27230 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
27240 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
27250 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
27260 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
27270 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27280 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
27290 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
272a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
272b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
272c0 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
272d0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50  pPager->pWal, pP
272e0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
272f0 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
27300 65 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20  eSize, pTmp);.  
27310 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30  pPager->pWal = 0
27320 3b 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72  ;.#endif.  pager
27330 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
27340 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27350 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
27360 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
27370 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69  {.    /* If it i
27380 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65  s open, sync the
27390 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
273a0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c  fore calling Unl
273b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a  ockAndRollback..
273c0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
273d0 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e  s not done, then
273e0 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72   an unsynced por
273f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e  tion of the open
27400 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a   journal .    **
27410 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61   file may be pla
27420 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  yed back into th
27430 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61  e database. If a
27440 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
27450 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68  ccurs .    ** wh
27460 69 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70  ile this is happ
27470 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
27480 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65  ase could become
27490 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a   corrupt..    **
274a0 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72  .    ** If an er
274b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
274c0 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20   trying to sync 
274d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69  the journal, shi
274e0 66 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ft the pager.   
274f0 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52   ** into the ERR
27500 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63  OR state. This c
27510 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52  auses UnlockAndR
27520 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63  ollback to unloc
27530 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  k the.    ** dat
27540 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20  abase and close 
27550 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27560 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74   without attempt
27570 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20  ing to roll it. 
27580 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69     ** back or fi
27590 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e  nalize it. The n
275a0 65 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65  ext database use
275b0 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64  r will have to d
275c0 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  o hot-journal.  
275d0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65    ** rollback be
275e0 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74  fore accessing t
275f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27610 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27620 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61  jfd) ){.      pa
27630 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
27640 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  , pagerSyncHotJo
27650 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a  urnal(pPager));.
27660 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55      }.    pagerU
27670 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
27680 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
27690 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
276a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62  Malloc();.  enab
276b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
276c0 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
276d0 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  RTRACE(("CLOSE %
276e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
276f0 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41  ager)));.  IOTRA
27700 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22  CE(("CLOSE %p\n"
27710 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c  , pPager)).  sql
27720 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
27730 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69  er->jfd);.  sqli
27740 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
27750 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
27760 33 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b  3PageFree(pTmp);
27770 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27780 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
27790 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
277a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
277b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
277c0 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
277d0 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
277e0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
277f0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27800 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
27810 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
27820 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
27830 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
27840 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
27850 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
27860 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
27870 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
27880 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
27890 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
278a0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
278b0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
278c0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
278d0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
278e0 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
278f0 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
27900 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
27910 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
27920 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
27930 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
27940 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
27950 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
27960 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
27970 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
27980 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
27990 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
279a0 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
279b0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
279c0 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
279d0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
279e0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
279f0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
27a00 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
27a10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
27a20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
27a30 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
27a40 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
27a50 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
27a60 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
27a70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27a80 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
27a90 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
27aa0 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  c flag is set, t
27ab0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
27ac0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
27ad0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
27ae0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
27af0 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
27b00 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20  ournal-mode and 
27b10 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63  the .** device c
27b20 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
27b30 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  f the file-syste
27b40 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  m, as follows:.*
27b50 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27b60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27b70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
27b80 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63  rnal file, no ac
27b90 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20  tion need.**    
27ba0 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a   be taken..**.**
27bb0 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20     * Otherwise, 
27bc0 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  if the device do
27bd0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27be0 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  he SAFE_APPEND p
27bf0 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20  roperty,.**     
27c00 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
27c10 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  eld of the most 
27c20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e  recently written
27c30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a   journal header.
27c40 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65  **     is update
27c50 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  d to contain the
27c60 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e   number of journ
27c70 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  al records that 
27c80 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e  have.**     been
27c90 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69   written followi
27ca0 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61  ng it. If the pa
27cb0 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67  ger is operating
27cc0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a   in full-sync.**
27cd0 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20       mode, then 
27ce0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27cf0 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72   is synced befor
27d00 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20  e this field is 
27d10 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
27d20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65   * If the device
27d30 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
27d40 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c  t the SEQUENTIAL
27d50 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20   property, then 
27d60 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  .**     journal 
27d70 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a  file is synced..
27d80 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65  **.** Or, in pse
27d90 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20  udo-code:.**.** 
27da0 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65    if( NOT <in-me
27db0 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b  mory journal> ){
27dc0 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
27dd0 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a  SAFE_APPEND ){.*
27de0 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c  *       if( <ful
27df0 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78  l-sync mode> ) x
27e00 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
27e10 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c  le>);.**       <
27e20 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c  update nRec fiel
27e30 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20  d>.**     } .** 
27e40 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55      if( NOT SEQU
27e50 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c  ENTIAL ) xSync(<
27e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a  journal file>);.
27e70 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20  **   }.**.** If 
27e80 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
27e90 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
27ea0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
27eb0 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
27ec0 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
27ed0 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
27ee0 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
27ef0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
27f00 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
27f10 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
27f20 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
27f30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
27f40 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
27f50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
27f60 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
27f70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
27f80 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20   newHdr){.  int 
27f90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27fb0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
27fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27fd0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
27fe0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
27ff0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
28000 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
28010 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
28020 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
28030 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
28040 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
28050 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
28060 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63  pPager) );..  rc
28070 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45   = sqlite3PagerE
28080 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61  xclusiveLock(pPa
28090 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
280a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
280b0 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  rn rc;..  if( !p
280c0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
280d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
280e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
280f0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
28100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
28110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28120 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
28130 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
28140 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
28150 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
28160 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
28170 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
28180 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
28190 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
281a0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
281b0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
281c0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
281d0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
281e0 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
281f0 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
28200 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
28210 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
28220 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
28230 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
28240 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
28250 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
28260 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
28270 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
28280 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
28290 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
282a0 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
282b0 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
282c0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
282d0 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
282e0 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
282f0 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
28300 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
28310 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
28320 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
28330 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
28340 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
28350 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
28360 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61  connection's tra
28370 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61  nsaction), and a
28380 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d   crash or power-
28390 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20  failure .       
283a0 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72   ** occurs after
283b0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
283c0 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73   but before this
283d0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
283e0 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  es .        ** a
283f0 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20  nything else to 
28400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28410 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c   (or commits/rol
28420 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20  ls back its .   
28430 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
28440 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74  ion), then SQLit
28450 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e  e may become con
28460 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67  fused when doing
28470 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
28480 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
28490 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
284a0 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79  recovery. It may
284b0 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20   roll back all. 
284c0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69         ** of thi
284d0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61  s connections da
284e0 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64  ta, then proceed
284f0 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   to rolling back
28500 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20   the old,.      
28510 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65    ** out-of-date
28520 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f   data that follo
28530 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20  ws it. Database 
28540 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
28550 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28560 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
28570 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f   this, if the jo
28580 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
28590 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69  appear to contai
285a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76  n.        ** a v
285b0 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c  alid header foll
285c0 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72  owing Pager.jour
285d0 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69  nalOff, then wri
285e0 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20  te a 0x00.      
285f0 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65    ** byte to the
28600 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20   start of it to 
28610 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20  prevent it from 
28620 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64  being recognized
28630 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28640 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65       ** Variable
28650 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
28660 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
28670 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68  fset at which th
28680 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  is.        ** pr
28690 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72  oblematic header
286a0 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20   will occur, if 
286b0 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69  it exists. aMagi
286c0 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20  c is used .     
286d0 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f     ** as a tempo
286e0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69  rary buffer to i
286f0 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74  nspect the first
28700 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73   couple of bytes
28710 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
28720 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75  he potential jou
28730 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20  rnal header..   
28740 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28750 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73  i64 iNextHdrOffs
28760 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61  et;.        u8 a
28770 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20  Magic[8];.      
28780 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a    u8 zHeader[siz
28790 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
287a0 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20  c)+4];..        
287b0 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
287c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
287d0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
287e0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70  gic));.        p
287f0 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
28800 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
28810 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72  lMagic)], pPager
28820 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
28830 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74    iNextHdrOffset
28840 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
28850 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
28860 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28870 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
28880 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  jfd, aMagic, 8, 
28890 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
288a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
288b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
288c0 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20  =memcmp(aMagic, 
288d0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
288e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
288f0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
28900 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20  erobyte = 0;.   
28910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28920 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28930 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74  r->jfd, &zerobyt
28940 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66  e, 1, iNextHdrOf
28950 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  fset);.        }
28960 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28970 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
28980 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
28990 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
289a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
289b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
289c0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
289d0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
289e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
289f0 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
28a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
28a10 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
28a20 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
28a30 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
28a40 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
28a50 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
28a60 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
28a70 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
28a80 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28a90 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
28aa0 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
28ab0 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
28ac0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
28ad0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
28ae0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
28af0 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
28b00 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
28b10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
28b20 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
28b30 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
28b40 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
28b50 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
28b60 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
28b70 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
28b80 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
28b90 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
28ba0 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
28bb0 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
28bc0 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
28bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
28be0 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
28bf0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
28c00 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
28c10 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
28c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
28c30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
28c40 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28c50 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
28c60 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
28c70 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
28c80 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
28c90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
28ca0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
28cb0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28cc0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28cd0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
28ce0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28cf0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28d00 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
28d10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28d20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28d30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28d40 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
28d50 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
28d60 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
28d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
28d80 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
28d90 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
28da0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
28db0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
28dc0 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
28dd0 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
28de0 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
28df0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28e10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28e20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
28e30 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
28e40 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
28e50 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28e60 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
28e70 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28e80 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28e90 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
28ea0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
28eb0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
28ec0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
28ed0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
28ee0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
28ef0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
28f00 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
28f10 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
28f20 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
28f30 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
28f40 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
28f50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28f60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28f70 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65    }..      pPage
28f80 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28f90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28fa0 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ff;.      if( ne
28fb0 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26  wHdr && 0==(iDc&
28fc0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
28fd0 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
28fe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
28ff0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
29000 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
29010 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
29020 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29030 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
29040 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
29050 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
29060 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
29070 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
29080 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
29090 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65  .  /* Unless the
290a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53   pager is in noS
290b0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
290c0 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a  urnal file was j
290d0 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73  ust .  ** succes
290e0 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45  sfully synced. E
290f0 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72  ither way, clear
29100 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
29110 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20  SYNC flag on .  
29120 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20  ** all pages..  
29130 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
29140 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
29150 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
29160 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74  );.  pPager->eSt
29170 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
29180 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65  ER_DBMOD;.  asse
29190 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
291a0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
291b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
291c0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
291d0 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  he argument is t
291e0 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69  he first in a li
291f0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72  nked list of dir
29200 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  ty pages connect
29210 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48  ed.** by the PgH
29220 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
29230 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
29240 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65   writes each one
29250 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65   of the.** in-me
29260 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68  mory pages in th
29270 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61  e list to the da
29280 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
29290 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a   argument may.**
292a0 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73   be NULL, repres
292b0 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20  enting an empty 
292c0 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61  list. In this ca
292d0 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
292e0 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a   is.** a no-op..
292f0 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
29300 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61  must hold at lea
29310 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
29320 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ck when this fun
29330 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c  ction.** is call
29340 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69  ed. Before writi
29350 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74  ng anything to t
29360 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29370 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69  , this lock.** i
29380 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e  s upgraded to an
29390 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
293a0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e   If the lock can
293b0 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  not be obtained,
293c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
293d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
293e0 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74  no data is writt
293f0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
29400 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  se file..** .** 
29410 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
29420 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65  a temp-file page
29430 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c  r and the actual
29440 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c   file-system fil
29450 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20  e.** is not yet 
29460 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61  open, it is crea
29470 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62  ted and opened b
29480 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
29490 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75  s .** written ou
294a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  t..**.** Once th
294b0 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  e lock has been 
294c0 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66  upgraded and, if
294d0 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20   necessary, the 
294e0 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20  file opened,.** 
294f0 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72  the pages are wr
29500 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65  itten out to the
29510 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
29520 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72  n list order. Wr
29530 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20  iting.** a page 
29540 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74  is skipped if it
29550 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66   meets either of
29560 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
29570 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20  riteria:.**.**  
29580 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62   * The page numb
29590 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
295a0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
295b0 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50   or.**   * The P
295c0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
295d0 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74  flag is set on t
295e0 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  he page..**.** I
295f0 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20  f writing out a 
29600 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20  page causes the 
29610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29620 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46   grow, Pager.dbF
29630 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70  ileSize.** is up
29640 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  dated accordingl
29650 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20  y. If page 1 is 
29660 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65  written out, the
29670 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68  n the value cach
29680 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64  ed.** in Pager.d
29690 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75  bFileVers[] is u
296a0 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20  pdated to match 
296b0 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74  the new value st
296c0 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64  ored in.** the d
296d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
296e0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
296f0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
29700 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
29710 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
29720 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
29730 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
29740 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
29750 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c   Or, if the EXCL
29760 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f  USIVE lock canno
29770 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64  t.** be obtained
29780 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  , SQLITE_BUSY is
29790 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
297a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
297b0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61  rite_pagelist(Pa
297c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
297d0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  dr *pList){.  in
297e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
297f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29800 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29810 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
29820 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
29830 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c   called for roll
29840 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57  back pagers in W
29850 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74  RITER_DBMOD stat
29860 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
29870 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
29880 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
29890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
298a0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
298b0 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  BMOD );.  assert
298c0 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
298d0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
298e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
298f0 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66  file is a temp-f
29900 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29910 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29920 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a  n it now. It.  *
29930 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  * is not possibl
29940 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f  e for rc to be o
29950 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
29960 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e  _OK if this bran
29970 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e  ch.  ** is taken
29980 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f  , as pager_wait_
29990 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  on_lock() is a n
299a0 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69  o-op for temp-fi
299b0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
299c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
299d0 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
299e0 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
299f0 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ile && rc==SQLIT
29a00 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  E_OK );.    rc =
29a10 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70   pagerOpentemp(p
29a20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
29a30 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
29a40 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ags);.  }..  /* 
29a50 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  Before the first
29a60 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65   write, give the
29a70 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77   VFS a hint of w
29a80 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20  hat the final.  
29a90 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c  ** file size wil
29aa0 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  l be..  */.  ass
29ab0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29ac0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
29ad0 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66  ger->fd) );.  if
29ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29af0 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64  .   && pPager->d
29b00 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72  bHintSize<pPager
29b10 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28  ->dbSize.   && (
29b20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c  pList->pDirty ||
29b30 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61   pList->pgno>pPa
29b40 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29  ger->dbHintSize)
29b50 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
29b60 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
29b70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
29b80 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
29b90 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
29ba0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
29bb0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
29bc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
29bd0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
29be0 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20  NT, &szFile);.  
29bf0 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74    pPager->dbHint
29c00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
29c10 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68  bSize;.  }..  wh
29c20 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29c30 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
29c40 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
29c50 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
29c60 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
29c70 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
29c80 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
29c90 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
29ca0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
29cb0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
29cc0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
29cd0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
29ce0 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
29cf0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
29d00 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
29d10 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
29d20 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
29d30 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
29d40 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
29d50 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
29d60 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
29d70 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
29d80 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
29d90 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
29da0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
29db0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
29dc0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
29dd0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
29de0 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
29df0 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
29e00 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
29e10 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
29e20 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
29e30 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
29e40 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
29e50 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
29e60 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74  ize;   /* Offset
29e70 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20   to write */.   
29e80 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20     char *pData; 
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29eb0 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69    /* Data to wri
29ec0 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20  te */    ..     
29ed0 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d   assert( (pList-
29ee0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29ef0 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
29f00 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
29f10 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77  gno==1 ) pager_w
29f20 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
29f30 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20  er(pList);..    
29f40 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20    /* Encode the 
29f50 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
29f60 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
29f70 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
29f80 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53  gno, 6, return S
29f90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
29fa0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
29fb0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
29fc0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
29fd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29fe0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
29ff0 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
2a000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a010 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
2a020 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
2a030 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
2a040 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
2a050 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
2a060 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
2a070 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
2a080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a090 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
2a0a0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
2a0b0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
2a0c0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a0d0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
2a0e0 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
2a0f0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
2a100 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
2a110 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
2a120 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
2a130 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
2a140 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
2a150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a160 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
2a170 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
2a180 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2a190 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
2a1a0 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
2a1b0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
2a1c0 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d  AGER_STAT_WRITE]
2a1d0 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  ++;..      /* Up
2a1e0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
2a1f0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
2a200 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2a210 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
2a220 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
2a230 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
2a240 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
2a250 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74  (u8*)pList->pDat
2a260 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52  a);..      PAGER
2a270 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64  TRACE(("STORE %d
2a280 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
2a290 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
2a2a0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
2a2b0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
2a2c0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
2a2d0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
2a2e0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
2a2f0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
2a300 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  r, pgno));.     
2a310 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
2a320 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2a330 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65  b_count);.    }e
2a340 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
2a350 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20  TRACE(("NOSTORE 
2a360 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a370 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a380 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20  pgno));.    }.  
2a390 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
2a3a0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20  hash(pList);.   
2a3b0 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
2a3c0 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72  pDirty;.  }..  r
2a3d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a3e0 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20 74  ** Ensure that t
2a3f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2a400 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20  ile is open. If 
2a410 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
2a420 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  en, this .** fun
2a430 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2a440 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2a450 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2a460 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
2a470 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c   according to pl
2a480 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54  an. An .** SQLIT
2a490 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f  E_IOERR_XXX erro
2a4a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2a4b0 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20  ed if a call to 
2a4c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20  sqlite3OsOpen() 
2a4d0 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  .** fails..*/.st
2a4e0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62  atic int openSub
2a4f0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
2a500 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
2a510 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a520 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2a530 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
2a540 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
2a550 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   =  SQLITE_OPEN_
2a560 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51 4c  SUBJOURNAL | SQL
2a570 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
2a580 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49  TE .      | SQLI
2a590 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
2a5a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
2a5b0 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c 20  LUSIVE .      | 
2a5c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2a5d0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20 69  TEONCLOSE;.    i
2a5e0 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20  nt nStmtSpill = 
2a5f0 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53  sqlite3Config.nS
2a600 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69 66  tmtSpill;.    if
2a610 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2a620 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2a630 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
2a640 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
2a650 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
2a660 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d 31   nStmtSpill = -1
2a670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2a680 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
2a690 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
2a6a0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  , 0, pPager->sjf
2a6b0 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74 53  d, flags, nStmtS
2a6c0 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pill);.  }.  ret
2a6d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a6e0 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
2a6f0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2a700 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
2a710 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
2a720 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal. .**.** If 
2a730 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
2a740 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
2a750 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
2a760 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
2a770 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
2a780 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
2a790 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
2a7a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2a7b0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2a7c0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
2a7d0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
2a7e0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
2a7f0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
2a800 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
2a810 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a820 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
2a830 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
2a840 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
2a850 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
2a860 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
2a870 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
2a880 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2a890 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
2a8a0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
2a8b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
2a8c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
2a8d0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
2a8e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2a8f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
2a900 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
2a910 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
2a920 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
2a930 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
2a940 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
2a950 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2a960 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2a970 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a980 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2a990 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
2a9a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
2a9b0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2a9c0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
2a9d0 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
2a9e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2a9f0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
2aa00 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
2aa10 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
2aa20 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29 20  al(pPager, pPg) 
2aa30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 67  .         || pPg
2aa40 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2aa50 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20 29  bOrigSize .    )
2aa60 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  ;.    rc = openS
2aa70 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
2aa80 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
2aa90 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77 61  e sub-journal wa
2aaa0 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
2aab0 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61 6c  fully (or was al
2aac0 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20 20  ready open),.   
2aad0 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a 6f   ** write the jo
2aae0 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e 74  urnal record int
2aaf0 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  o the file.  */.
2ab00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ab10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 76  TE_OK ){.      v
2ab20 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
2ab30 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69  ->pData;.      i
2ab40 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34  64 offset = (i64
2ab50 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  )pPager->nSubRec
2ab60 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
2ab70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61  Size);.      cha
2ab80 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20  r *pData2;.  .  
2ab90 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2aba0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2abb0 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2abc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2abd0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2abe0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2abf0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2ac00 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2ac10 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2ac20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2ac30 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2ac40 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2ac50 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2ac60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2ac70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ac80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ac90 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2aca0 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2acb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2acc0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2acd0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2ace0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2acf0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2ad00 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2ad10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2ad20 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2ad30 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2ad40 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2ad50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2ad60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2ad70 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2ad80 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2ad90 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2ada0 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2adb0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2adc0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2add0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2ade0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2adf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae00 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2ae10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ae20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2ae30 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2ae40 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2ae50 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2ae60 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2ae70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2ae80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2ae90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2aea0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2aeb0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2aec0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2aed0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2aee0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2aef0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2af00 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2af10 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2af20 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2af30 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2af40 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2af50 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2af60 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2af70 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2af80 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2af90 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2afa0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2afb0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2afc0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2afd0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2afe0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2aff0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2b000 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2b010 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b020 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2b030 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2b040 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2b050 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2b060 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2b070 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2b080 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2b090 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2b0a0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2b0b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2b0c0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2b0d0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2b0e0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2b0f0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2b100 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2b110 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2b120 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2b130 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2b140 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2b150 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2b160 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2b170 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2b180 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2b190 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2b1a0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2b1b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2b1c0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2b1d0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2b1e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b1f0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2b200 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b210 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2b220 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2b230 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2b240 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2b250 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2b260 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2b270 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2b280 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2b290 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2b2a0 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2b2b0 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2b2c0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2b2d0 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2b2e0 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2b2f0 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2b300 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2b310 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b320 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b330 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b340 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b350 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b360 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b370 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b380 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b390 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b3a0 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b3b0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b3c0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2b3d0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2b3e0 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2b3f0 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2b400 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2b410 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2b420 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2b430 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2b440 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2b450 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2b460 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2b470 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2b480 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2b490 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2b4a0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2b4b0 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2b4c0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2b4d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2b4e0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2b4f0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2b500 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2b510 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b520 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2b530 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2b540 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2b550 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2b560 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2b570 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2b580 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2b590 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2b5a0 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2b5b0 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2b5c0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2b5d0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2b5e0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2b5f0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2b600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b610 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b620 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b630 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2b640 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2b650 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b660 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b670 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2b680 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b690 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b6a0 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2b6b0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2b6c0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2b6d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b6e0 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2b6f0 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2b700 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b710 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b720 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b730 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b750 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b760 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b770 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b780 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2b790 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2b7a0 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2b7b0 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2b7c0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2b7d0 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2b7e0 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2b7f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2b810 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2b820 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2b830 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b840 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2b850 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b860 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2b870 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2b880 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b890 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2b8a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b8b0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2b8c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2b8d0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b8e0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2b8f0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2b900 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b910 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2b920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b930 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2b940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b950 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b960 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b970 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2b980 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2b990 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2b9a0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2b9b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2b9c0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2b9d0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2b9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b9f0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2ba00 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2ba10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2ba20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2ba30 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2ba40 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2ba50 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2ba60 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2ba70 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2ba80 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2ba90 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2baa0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2bab0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2bac0 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2bad0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2bae0 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2baf0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2bb00 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2bb10 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2bb20 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2bb30 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2bb40 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2bb50 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2bb60 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2bb70 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2bb80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2bb90 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2bba0 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2bbb0 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2bbc0 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2bbd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2bbe0 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2bbf0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2bc00 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2bc10 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2bc20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2bc30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bc40 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2bc50 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2bc60 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2bc70 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2bc80 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2bc90 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2bca0 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2bcb0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2bcc0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2bcd0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2bce0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2bcf0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2bd00 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2bd10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2bd20 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2bd30 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2bd40 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2bd50 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2bd60 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2bd70 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2bd80 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2bd90 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2bda0 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2bdb0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2bdc0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2bdd0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2bde0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2bdf0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2be00 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2be10 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2be20 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2be30 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2be40 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2be50 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2be60 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2be70 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2be80 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2be90 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2bea0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2beb0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2bec0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2bed0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2bee0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2bef0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bf00 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bf10 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bf20 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bf30 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2bf40 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bf50 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bf60 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bf70 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bf80 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bf90 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bfa0 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bfb0 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bfc0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bfd0 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bfe0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bff0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2c000 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2c010 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2c020 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2c030 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2c040 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2c050 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2c060 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2c070 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2c080 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2c090 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2c0a0 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2c0b0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2c0c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2c0d0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2c0e0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2c0f0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2c100 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2c110 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2c120 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2c130 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2c140 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2c150 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2c160 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2c170 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2c180 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2c190 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2c1a0 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2c1b0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2c1c0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2c1d0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2c1e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2c1f0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2c200 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2c210 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2c220 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2c230 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2c240 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2c250 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2c260 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2c270 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2c280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2c290 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2c2a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2c2b0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2c2c0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2c2d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2c2e0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2c2f0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2c300 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2c310 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2c320 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2c330 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2c340 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2c350 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2c360 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2c370 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2c380 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2c390 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2c3a0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2c3b0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2c3c0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c3d0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c3e0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c3f0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c400 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c410 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c420 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c440 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c450 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c460 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c470 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c480 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c490 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c4a0 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c4b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c4c0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c4d0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c4e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c4f0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c500 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c510 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c520 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c530 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c540 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c550 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c560 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c570 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c580 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c590 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c5a0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c5b0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c5c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c5d0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c5e0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c5f0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c600 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c610 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c620 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c630 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c640 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c650 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c660 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c670 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c680 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c690 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c6a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c6b0 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c6c0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c6d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c6e0 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c6f0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c700 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c710 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c720 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c730 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c740 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c750 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c760 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c770 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c780 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c790 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c7a0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c7b0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c7c0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c7d0 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e  al).  */.  journ
2c7e0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2c7f0 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e  ND8(sqlite3Journ
2c800 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 0a  alSize(pVfs));..
2c810 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
2c820 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
2c830 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
2c840 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
2c850 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
2c860 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c870 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
2c880 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
2c890 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
2c8a0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
2c8b0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
2c8c0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
2c8d0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
2c8e0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
2c8f0 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  up(0, zFilename)
2c900 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
2c910 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75  hname==0  ) retu
2c920 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
2c930 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50 61 74  BKPT;.      nPat
2c940 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2c950 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2c960 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2c970 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2c980 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2c990 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2c9a0 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2c9b0 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2c9c0 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2c9d0 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2c9e0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2c9f0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2ca00 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2ca10 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2ca20 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2ca30 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2ca40 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2ca50 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2ca60 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2ca70 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2ca80 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2ca90 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2caa0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2cab0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2cac0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2cad0 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2cae0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2caf0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2cb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2cb10 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2cb20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2cb30 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2cb40 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2cb50 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2cb60 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2cb70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2cb80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2cb90 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2cba0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2cbb0 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2cbc0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2cbd0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2cbe0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2cbf0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2cc00 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2cc10 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2cc20 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2cc30 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2cc40 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2cc50 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2cc60 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2cc70 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2cc80 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2cc90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2cca0 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2ccb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ccc0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2ccd0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2cce0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2ccf0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2cd00 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2cd10 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2cd20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2cd30 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2cd40 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2cd50 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2cd60 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2cd70 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2cd80 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2cd90 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2cda0 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2cdb0 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2cdc0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2cdd0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2cde0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2cdf0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2ce00 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2ce10 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2ce20 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2ce30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2ce40 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2ce50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2ce60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2ce70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ce80 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2ce90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2cea0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ceb0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2cec0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2ced0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2cee0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2cef0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2cf00 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2cf10 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cf20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2cf30 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2cf40 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2cf50 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2cf60 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2cf70 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf90 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2cfa0 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2cfb0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2cfe0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2cff0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2d000 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2d010 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2d020 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2d030 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2d040 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2d050 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2d060 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2d070 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2d080 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2d090 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2d0a0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2d0b0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2d0c0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2d0d0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2d0e0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2d0f0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2d100 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2d110 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2d120 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2d130 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2d140 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2d150 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2d160 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2d170 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2d180 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2d190 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d1a0 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2d1b0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2d1c0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2d1d0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2d1e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2d1f0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2d200 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2d210 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2d220 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2d230 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2d240 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d250 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2d260 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2d270 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2d280 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2d290 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2d2a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2d2b0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2d2c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2d2d0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2d2e0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2d2f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2d300 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2d310 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2d320 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2d330 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2d340 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2d350 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2d360 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2d370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d380 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50  M_BKPT;.  }.  pP
2d390 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20  ager =          
2d3a0 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74      (Pager*)(pPt
2d3b0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50  r);.  pPager->pP
2d3c0 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63  Cache =    (PCac
2d3d0 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  he*)(pPtr += ROU
2d3e0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2d3f0 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  er)));.  pPager-
2d400 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33  >fd =   (sqlite3
2d410 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d420 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2d430 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  e));.  pPager->s
2d440 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
2d450 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2d460 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2d470 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ile));.  pPager-
2d480 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33  >jfd =  (sqlite3
2d490 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2d4a0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d4b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
2d4c0 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72  ename =    (char
2d4d0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2d4e0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61  alFileSize);.  a
2d4f0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2d500 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67  E_ALIGNMENT(pPag
2d510 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f  er->jfd) );..  /
2d520 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
2d530 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
2d540 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
2d550 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
2d560 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
2d570 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
2d580 20 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61   assert( nPathna
2d590 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67  me>0 );.    pPag
2d5a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
2d5b0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2d5c0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2d5d0 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63   nUri);.    memc
2d5e0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
2d5f0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
2d600 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d610 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63   if( nUri ) memc
2d620 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2d630 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2d640 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2d650 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d660 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2d670 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2d680 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2d690 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2d6a0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d6b0 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b  journal\000", 8+
2d6c0 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  2);.    sqlite3F
2d6d0 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d6e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d6f0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
2d700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d710 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61  OMIT_WAL.    pPa
2d720 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61  ger->zWal = &pPa
2d730 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2d740 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20  athname+8+1];.  
2d750 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2d760 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  >zWal, zPathname
2d770 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d780 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d790 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ->zWal[nPathname
2d7a0 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34  ], "-wal\000", 4
2d7b0 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
2d7c0 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67  FileSuffix3(pPag
2d7d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2d7e0 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65  Pager->zWal);.#e
2d7f0 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
2d800 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2d810 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2d820 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2d830 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2d840 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2d850 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2d860 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2d870 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2d880 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2d890 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2d8a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2d8b0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2d8c0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2d8d0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2d8e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2d8f0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2d900 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2d910 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2d920 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2d930 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2d940 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2d950 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2d960 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2d970 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2d980 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2d990 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2d9a0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2d9b0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2d9c0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d9d0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2d9e0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2d9f0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2da00 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2da10 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2da20 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2da30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2da40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2da50 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2da60 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2da70 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2da80 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2da90 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2daa0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2dab0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2dac0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2dad0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2dae0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2daf0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
2db00 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2db10 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2db20 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2db30 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64  .      if( !read
2db40 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
2db50 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
2db60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
2db70 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46  ssert(SQLITE_DEF
2db80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2db90 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dba0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
2dbb0 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
2dbc0 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65  eDflt<pPager->se
2dbd0 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20  ctorSize ){.    
2dbe0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
2dbf0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
2dc00 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2dc10 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
2dc20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2dc30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2dc40 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dc50 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ZE;.          }e
2dc60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2dc70 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2dc80 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2dc90 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2dca0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66   }.        }.#if
2dcb0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2dcc0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
2dcd0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2dce0 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
2dcf0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2dd00 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2dd10 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2dd20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2dd30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2dd40 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
2dd50 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
2dd60 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2dd70 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dd80 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2dd90 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2dda0 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2ddb0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2ddc0 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2ddd0 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  *2){.           
2dde0 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
2ddf0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
2de00 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
2de10 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2de20 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  lt = ii;.       
2de30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2de40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
2de50 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
2de60 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b    pPager->noLock
2de70 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62   = sqlite3_uri_b
2de80 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65  oolean(zFilename
2de90 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a  , "nolock", 0);.
2dea0 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26        if( (iDc &
2deb0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d   SQLITE_IOCAP_IM
2dec0 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20  MUTABLE)!=0.    
2ded0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72     || sqlite3_ur
2dee0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2def0 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22  ame, "immutable"
2df00 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
2df10 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51    vfsFlags |= SQ
2df20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2df30 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  LY;.          go
2df40 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  to act_like_temp
2df50 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _file;.      }. 
2df60 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2df70 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2df80 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2df90 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2dfa0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2dfb0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2dfc0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2dfd0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2dfe0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2dff0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2e000 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2e010 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2e020 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2e030 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2e040 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2e050 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2e060 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2e070 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2e080 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2e090 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2e0a0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2e0b0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2e0c0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2e0d0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2e0e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2e0f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2e100 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2e110 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20  his branch also 
2e120 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d  runs for files m
2e130 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62  arked as immutab
2e140 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f  le..    */ .act_
2e150 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a  like_temp_file:.
2e160 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
2e170 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
2e180 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
2e190 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74  DER;     /* Pret
2e1a0 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68  end we already h
2e1b0 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ave a lock */.  
2e1c0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2e1d0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2e1e0 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20  ;    /* Pretend 
2e1f0 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53  we are in EXCLUS
2e200 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  IVE mode */.    
2e210 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d  pPager->noLock =
2e220 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2e230 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b     /* Do no lock
2e240 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f  ing */.    readO
2e250 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2e260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2e270 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2e280 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2e290 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2e2a0 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2e2b0 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2e2c0 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2e2d0 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2e2e0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2e2f0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2e300 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2e310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e320 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e330 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2e340 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2e350 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2e360 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2e370 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2e380 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2e390 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2e3a0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2e3b0 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65   the PCache obje
2e3c0 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ct. */.  if( rc=
2e3d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e3e0 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
2e3f0 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78  <1000 );.    nEx
2e400 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2e410 74 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tra);.    rc = s
2e420 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
2e430 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
2e440 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
2e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e460 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
2e470 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
2e480 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
2e490 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a  ->pPCache);.  }.
2e4a0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2e4b0 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65  r occurred above
2e4c0 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65  , free the  Page
2e4d0 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
2e4e0 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
2e4f0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
2e500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e510 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
2e520 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2e530 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
2e540 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
2e550 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
2e560 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
2e570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2e580 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2e590 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20  "OPEN %d %s\n", 
2e5a0 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61  FILEHANDLEID(pPa
2e5b0 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72  ger->fd), pPager
2e5c0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  ->zFilename));. 
2e5d0 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
2e5e0 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
2e5f0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2e600 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d  ame))..  pPager-
2e610 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  >useJournal = (u
2e620 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20  8)useJournal;.  
2e630 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
2e640 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
2e650 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
2e660 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
2e670 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
2e680 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e690 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
2e6a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e6b0 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
2e6c0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
2e6d0 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
2e6e0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
2e6f0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
2e700 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
2e710 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2e720 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
2e730 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2e740 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2e750 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2e760 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2e770 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2e780 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e790 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2e7a0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2e7b0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2e7c0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2e7d0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2e7e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2e7f0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2e800 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2e810 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2e820 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2e830 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2e840 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e850 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2e860 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2e870 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2e880 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2e890 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2e8a0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2e8b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2e8c0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2e8d0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2e8e0 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2e8f0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2e900 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e910 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2e920 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e930 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30  er->extraSync==0
2e940 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e950 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e960 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  s==0 );.    asse
2e970 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  rt( pPager->walS
2e980 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20  yncFlags==0 );. 
2e990 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e9a0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2e9b0 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
2e9c0 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
2e9d0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2e9e0 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
2e9f0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2ea00 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
2ea10 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2ea20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
2ea30 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2ea40 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c  TE_SYNC_NORMAL |
2ea50 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41   WAL_SYNC_TRANSA
2ea60 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61 67  CTIONS;.    pPag
2ea70 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2ea80 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
2ea90 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
2eaa0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
2eab0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2eac0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
2ead0 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
2eae0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
2eaf0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
2eb00 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78  Extra = (u16)nEx
2eb10 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
2eb20 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
2eb30 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2eb40 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
2eb50 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69  MIT;.  assert( i
2eb60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2eb70 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b  ) || tempFile );
2eb80 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
2eb90 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
2eba0 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  !useJournal ){. 
2ebb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2ebc0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2ebd0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a  OURNALMODE_OFF;.
2ebe0 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44    }else if( memD
2ebf0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
2ec00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2ec10 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2ec20 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
2ec30 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
2ec40 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
2ec50 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
2ec60 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
2ec70 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52   */.  pPager->xR
2ec80 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
2ec90 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  t;.  /* memset(p
2eca0 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
2ecb0 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
2ecc0 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a  aHash)); */.  /*
2ecd0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20   pPager->szMmap 
2ece0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2ecf0 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20 77 69  _MMAP_SIZE // wi
2ed00 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62 74 72  ll be set by btr
2ed10 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  ee.c */..  *ppPa
2ed20 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
2ed30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ed40 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72 69 66 79 20  ;.}.../* Verify 
2ed50 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2ed60 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
2ed70 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e  e deleted or ren
2ed80 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  amed out from.**
2ed90 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72   under the pager
2eda0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2edb0 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62  _OK if the datab
2edc0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 65 72  ase is still wer
2edd0 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f  e it ought.** to
2ede0 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65   be on disk.  Re
2edf0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53  turn non-zero (S
2ee00 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
2ee10 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f  BMOVED or some o
2ee20 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  ther error.** co
2ee30 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f  de from sqlite3O
2ee40 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74 68  sAccess()) if th
2ee50 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 67  e database has g
2ee60 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a  one missing..*/.
2ee70 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62  static int datab
2ee80 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67  aseIsUnmoved(Pag
2ee90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2eea0 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30  nt bHasMoved = 0
2eeb0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2eec0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
2eed0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
2eee0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
2eef0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
2ef00 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ef10 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
2ef20 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
2ef30 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  && pPager->zFile
2ef40 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20  name[0] );.  rc 
2ef50 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
2ef60 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
2ef70 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
2ef80 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73  HAS_MOVED, &bHas
2ef90 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63  Moved);.  if( rc
2efa0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
2efb0 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  D ){.    /* If t
2efc0 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c  he HAS_MOVED fil
2efd0 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69  e-control is uni
2efe0 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75  mplemented, assu
2eff0 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2f000 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  .    ** has not 
2f010 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61  been moved.  Tha
2f020 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72 69  t is the histori
2f030 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20  cal behavior of 
2f040 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f  SQLite: prior to
2f050 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  .    ** version 
2f060 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20  3.8.3, it never 
2f070 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72  checked */.    r
2f080 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2f090 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2f0a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73  QLITE_OK && bHas
2f0b0 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20  Moved ){.    rc 
2f0c0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
2f0d0 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20  Y_DBMOVED;.  }. 
2f0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2f0f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f100 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
2f110 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
2f120 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
2f130 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
2f140 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
2f150 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
2f160 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
2f170 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
2f180 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
2f190 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
2f1a0 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
2f1b0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
2f1c0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
2f1d0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
2f1e0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
2f1f0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
2f200 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
2f210 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
2f220 77 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72  wing criteria ar
2f230 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  e met:.**.**   *
2f240 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2f250 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
2f260 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64  file system, and
2f270 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65  .**   * No proce
2f280 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2f290 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
2f2a0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2f2b0 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a  ase file, and.**
2f2c0 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
2f2d0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73  e file itself is
2f2e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
2f2f0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61  bytes in size, a
2f300 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69  nd.**   * The fi
2f310 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
2f320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f330 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30  sts and is not 0
2f340 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  x00..**.** If th
2f350 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
2f360 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2f370 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
2f380 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
2f390 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
2f3a0 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
2f3b0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
2f3c0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
2f3d0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
2f3e0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
2f3f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
2f400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
2f410 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
2f420 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
2f430 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2f440 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2f450 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2f460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2f470 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68  tine does not ch
2f480 65 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  eck if there is 
2f490 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2f4a0 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20   filename.** at 
2f4b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2f4c0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
2f4d0 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65  , and that maste
2f4e0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  r journal file.*
2f4f0 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
2f500 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
2f510 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
2f520 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68  eally hot. In th
2f530 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20  is.** case this 
2f540 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
2f550 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69  urn a false-posi
2f560 74 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f  tive. The pager_
2f570 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f  playback().** ro
2f580 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
2f590 76 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ver that the jou
2f5a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2f5b0 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20   really hot and 
2f5c0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
2f5d0 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a  l it back. .**.*
2f5e0 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  * If a hot-journ
2f5f0 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  al file is found
2f600 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69   to exist, *pExi
2f610 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20  sts is set to 1 
2f620 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  and .** SQLITE_O
2f630 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e  K returned. If n
2f640 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  o hot-journal fi
2f650 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a  le is present, *
2f660 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65  pExists is.** se
2f670 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
2f680 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
2f690 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
2f6a0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
2f6b0 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e  g.** to determin
2f6c0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
2f6d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
2f6e0 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20  ile exists, the 
2f6f0 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  IO error.** code
2f700 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
2f710 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
2f720 45 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69  Exists is undefi
2f730 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2f740 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
2f750 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2f760 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
2f770 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
2f780 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
2f790 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
2f7a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2f7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2f7c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2f7d0 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20  t exists = 1;   
2f7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f7f0 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  rue if a journal
2f800 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
2f810 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70   */.  int jrnlOp
2f820 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50  en = !!isOpen(pP
2f830 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61  ager->jfd);..  a
2f840 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
2f850 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
2f860 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
2f870 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61  ager->fd) );.  a
2f880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2f890 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
2f8a0 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  N );..  assert( 
2f8b0 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28  jrnlOpen==0 || (
2f8c0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2f8d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2f8e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20  pPager->jfd) &. 
2f8f0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
2f900 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
2f910 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a  _OPEN.  ));..  *
2f920 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69  pExists = 0;.  i
2f930 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2f940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f950 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
2f960 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2f970 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2f980 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
2f990 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2f9a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
2f9b0 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f  ts ){.    int lo
2f9c0 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20  cked = 0;       
2f9d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f9e0 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f   some process ho
2f9f0 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  lds a RESERVED l
2fa00 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ock */..    /* R
2fa10 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65  ace condition he
2fa20 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f  re:  Another pro
2fa30 63 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20  cess might have 
2fa40 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65  been holding the
2fa50 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45  .    ** the RESE
2fa60 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61  RVED lock and ha
2fa70 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65  ve a journal ope
2fa80 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  n at the sqlite3
2fa90 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20  OsAccess() .    
2faa0 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62  ** call above, b
2fab0 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ut then delete t
2fac0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64  he journal and d
2fad0 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66  rop the lock bef
2fae0 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65  ore.    ** we ge
2faf0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
2fb00 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  ng sqlite3OsChec
2fb10 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20  kReservedLock() 
2fb20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20  call.  If that. 
2fb30 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73     ** is the cas
2fb40 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
2fb50 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72  might think ther
2fb60 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2fb70 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69  al when.    ** i
2fb80 6e 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20  n fact there is 
2fb90 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75  none.  This resu
2fba0 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70  lts in a false-p
2fbb0 6f 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69  ositive which wi
2fbc0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  ll.    ** be dea
2fbd0 6c 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70  lt with by the p
2fbe0 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e  layback routine.
2fbf0 20 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a    Ticket #3883..
2fc00 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2fc10 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2fc20 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
2fc30 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b  r->fd, &locked);
2fc40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2fc50 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65  ITE_OK && !locke
2fc60 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  d ){.      Pgno 
2fc70 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
2fc80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2fc90 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
2fca0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2fcb0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2fcc0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2fcd0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2fce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fcf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
2fd00 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2fd10 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e  is zero pages in
2fd20 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e   size, that mean
2fd30 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31  s that either (1
2fd40 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  ) the.        **
2fd50 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65   journal is a re
2fd60 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69  mnant from a pri
2fd70 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68  or database with
2fd80 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77   the same name w
2fd90 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
2fda0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fdb0 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f  e but not the jo
2fdc0 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65  urnal was delete
2fdd0 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e  d, or (2) the in
2fde0 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  itial.        **
2fdf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
2fe00 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65  t populates a ne
2fe10 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  w database is be
2fe20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
2fe30 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65  .        ** In e
2fe40 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20  ither case, the 
2fe50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
2fe60 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f   be deleted.  Ho
2fe70 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65  wever, take care
2fe80 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
2fe90 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
2fea0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
2feb0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
2fec0 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20   due to.        
2fed0 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ** journal_mode=
2fee0 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20  PERSIST..       
2fef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2ff00 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e  nPage==0 && !jrn
2ff10 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2ff20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
2ff30 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
2ff40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67           if( pag
2ff50 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
2ff60 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
2ff70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ff80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ff90 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
2ffa0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ffb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2ffc0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
2ffd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70  xclusiveMode ) p
2ffe0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2fff0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
30000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30010 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30020 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
30030 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
30040 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
30050 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30060 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
30070 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
30080 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
30090 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
300a0 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
300b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
300c0 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
300d0 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
300e0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
300f0 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
30100 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
30110 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
30120 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
30130 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
30140 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
30150 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
30160 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
30170 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30180 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
30190 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
301a0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
301b0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
301c0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
301d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
301e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
301f0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
30200 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
30210 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
30220 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30230 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
30240 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
30250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
30260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
30270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
30280 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
30290 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
302a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
302b0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
302c0 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
302d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
302e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
302f0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
30300 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
30310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
30320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30330 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
30340 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
30350 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
30360 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
30370 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30380 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
30390 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
303a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
303b0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
303c0 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
303d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
303e0 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
303f0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30400 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
30410 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
30420 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
30430 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
30440 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
30450 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
30460 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
30470 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
30480 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
30490 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
304a0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
304b0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
304c0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
304d0 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
304e0 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
304f0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
30500 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
30510 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
30520 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
30530 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
30540 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
30550 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
30560 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
30570 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
30580 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
30590 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
305a0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
305b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
305c0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
305d0 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
305e0 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
305f0 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
30600 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
30610 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30620 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
30630 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30640 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30670 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
30680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
30690 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
306a0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
306b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
306c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
306d0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
306e0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
306f0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e  te3PagerGet() un
30700 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66  til after this f
30710 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  unction.** has b
30720 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
30730 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68   called. If a sh
30740 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72  ared-lock is alr
30750 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a  eady held when.*
30760 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
30770 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
30780 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
30790 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  The following op
307a0 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73  erations are als
307b0 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  o performed by t
307c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
307d0 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20  .**   1) If the 
307e0 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
307f0 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e  ly in PAGER_OPEN
30800 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20   state (no lock 
30810 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  held.**      on 
30820 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30830 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65  e), then an atte
30840 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f  mpt is made to o
30850 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20  btain a.**      
30860 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
30870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30880 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  . Immediately af
30890 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a  ter obtaining.**
308a0 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44        the SHARED
308b0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d   lock, the file-
308c0 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65  system is checke
308d0 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  d for a hot-jour
308e0 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69  nal,.**      whi
308f0 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ch is played bac
30900 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f  k if present. Fo
30910 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d  llowing any hot-
30920 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
30930 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63   rollback, the c
30940 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
30950 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74  ache are validat
30960 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a  ed by checking.*
30970 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e  *      the 'chan
30980 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c  ge-counter' fiel
30990 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
309a0 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e  e file header an
309b0 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72  d.**      discar
309c0 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ded if they are 
309d0 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61  found to be inva
309e0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  lid..**.**   2) 
309f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
30a00 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
30a10 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74  sive-mode, and t
30a20 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74  here are current
30a30 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75  ly.**      no ou
30a40 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
30a50 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65  nces to any page
30a60 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65  s, and is in the
30a70 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a   error state,.**
30a80 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74        then an at
30a90 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
30aa0 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
30ab0 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72   state by discar
30ac0 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ding.**      the
30ad0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
30ae0 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
30af0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79  rolling back any
30b00 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   open journal.**
30b10 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a        file..**.*
30b20 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
30b30 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
30b40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
30b50 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
30b60 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20  rror .** occurs 
30b70 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
30b80 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
30b90 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
30ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a  ournal file or .
30bb0 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ** rolling back 
30bc0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  a journal file, 
30bd0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
30be0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
30bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
30c00 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67  erSharedLock(Pag
30c10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
30c20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
30c30 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
30c40 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
30c50 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   */..  /* This r
30c60 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
30c70 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65  alled from b-tre
30c80 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20  e and only when 
30c90 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a  there are no.  *
30ca0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  * outstanding pa
30cb0 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65  ges. This implie
30cc0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
30cd0 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69   state should ei
30ce0 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45  ther.  ** be OPE
30cf0 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41  N or READER. REA
30d00 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73  DER is only poss
30d10 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65  ible if the page
30d20 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a  r is or was in .
30d30 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61    ** exclusive a
30d40 63 63 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f  ccess mode..  */
30d50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30d60 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
30d70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
30d80 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
30d90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
30da0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
30db0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30dc0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30dd0 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
30de0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
30df0 41 44 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45  ADER );.  if( NE
30e00 56 45 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61  VER(MEMDB && pPa
30e10 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b  ger->errCode) ){
30e20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
30e30 65 72 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66  errCode; }..  if
30e40 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
30e50 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
30e60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30e70 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  OPEN ){.    int 
30e80 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  bHotJournal = 1;
30e90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30ea0 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
30eb0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d  s a hot journal-
30ec0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  file */..    ass
30ed0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
30ee0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
30ef0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
30f00 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30f10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30f20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30f30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30f40 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
30f50 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
30f60 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
30f70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
30f80 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
30f90 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
30fa0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
30fb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
30fc0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
30fd0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
30fe0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
30ff0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
31000 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
31010 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
31020 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
31030 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
31040 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
31050 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
31060 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
31070 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
31080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
310a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
310b0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
310c0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
310d0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
310e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
310f0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
31100 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
31110 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31120 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31130 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
31140 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
31150 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
31160 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
31170 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
31180 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
31190 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
311a0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
311b0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
311c0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
311d0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
311e0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
311f0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
31200 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
31210 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
31220 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
31230 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
31240 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
31250 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
31260 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
31270 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
31280 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
31290 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
312a0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
312b0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
312c0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
312d0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
312e0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
312f0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
31300 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
31310 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
31320 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
31330 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
31340 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
31350 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
31360 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
31370 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
31380 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
31390 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
313a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
313b0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
313c0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
313d0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
313e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
313f0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
31400 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
31410 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
31420 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
31430 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
31440 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
31450 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31460 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
31470 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
31480 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
314a0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
314b0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
314c0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
314d0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
314e0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
314f0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
31500 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
31510 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
31520 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
31530 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
31540 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
31550 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
31560 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
31570 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
31580 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
31590 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
315a0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
315b0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
315c0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
315d0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
315e0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
315f0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
31600 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
31610 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
31620 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
31630 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
31640 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
31650 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
31660 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
31670 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
31680 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
31690 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
316a0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
316b0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
316c0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
316d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
316e0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
316f0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
31700 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
31710 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
31720 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
31730 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
31740 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
31750 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
31760 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
31770 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
31780 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
31790 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
317a0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
317b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
317c0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
317d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
317e0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
317f0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31800 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
31810 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
31820 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
31830 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
31840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
31850 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
31860 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
31870 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31880 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
31890 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
318a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
318b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
318c0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
318d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
318e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
318f0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
31900 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
31910 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
31920 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
31930 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
31940 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31950 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
31960 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
31970 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
31980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31990 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
319a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
319b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
319c0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
319d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
319e0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
319f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
31a00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31a20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
31a30 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
31a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
31a50 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
31a60 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
31a70 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
31a80 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
31a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31aa0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
31ab0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
31ac0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
31ad0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
31ae0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
31af0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
31b00 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
31b10 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
31b20 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
31b30 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
31b40 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
31b50 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
31b60 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
31b70 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
31b80 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
31b90 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
31ba0 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
31bb0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
31bc0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
31bd0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
31be0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
31bf0 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
31c00 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
31c10 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
31c20 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
31c30 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
31c40 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
31c50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
31c60 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
31c70 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
31c80 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
31c90 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
31cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
31cc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
31cd0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
31ce0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
31cf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31d00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
31d10 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
31d20 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
31d30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
31d40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
31d50 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
31d60 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
31d70 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
31d80 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
31d90 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
31da0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
31db0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
31dc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31dd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31de0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
31df0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
31e00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
31e10 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
31e20 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
31e30 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
31e40 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
31e50 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
31e60 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
31e70 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
31e80 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
31e90 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
31ea0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
31eb0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
31ec0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
31ed0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
31ee0 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
31ef0 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
31f00 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
31f10 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
31f20 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
31f30 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
31f40 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
31f50 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
31f60 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
31f70 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
31f80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
31f90 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
31fa0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
31fb0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
31fc0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
31fd0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
31fe0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
31ff0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
32000 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
32010 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
32020 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
32030 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
32040 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
32050 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
32060 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
32070 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
32080 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
32090 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
320a0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
320b0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
320c0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
320d0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
320e0 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
320f0 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
32100 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
32110 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
32120 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
32130 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
32140 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
32150 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
32160 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
32170 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
32180 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
32190 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
321a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
321b0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
321c0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
321d0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
321e0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
321f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32200 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32210 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
32220 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
32230 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
32240 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
32250 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
32260 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
32270 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
32280 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
32290 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
322a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
322b0 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
322c0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
322d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
322e0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
322f0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
32300 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
32310 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
32320 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
32330 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
32340 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
32350 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
32360 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
32370 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
32380 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
32390 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
323a0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
323b0 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
323c0 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
323d0 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
323e0 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
323f0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
32400 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
32410 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
32420 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
32430 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
32440 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
32450 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
32460 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
32470 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
32480 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
32490 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
324a0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
324b0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
324c0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
324d0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
324e0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
324f0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
32500 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
32510 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
32520 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
32530 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
32540 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
32550 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
32560 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
32570 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
32580 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
32590 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
325a0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
325b0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
325c0 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
325d0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
325e0 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
325f0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
32600 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
32610 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
32620 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
32630 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20     Pgno nPage = 
32640 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  0;.      char db
32650 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
32660 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
32670 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20  rs)];..      rc 
32680 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
32690 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
326a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
326b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20   goto failed;.. 
326c0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30       if( nPage>0
326d0 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52   ){.        IOTR
326e0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
326f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
32700 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32710 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  )));.        rc 
32720 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
32730 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
32740 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
32750 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
32760 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
32780 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
32790 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
327a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
327b0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
327c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
327d0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
327e0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
327f0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
32800 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32810 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
32820 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
32830 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
32840 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
32850 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
32860 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
32870 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61  .        /* Unma
32880 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  p the database f
32890 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69  ile. It is possi
328a0 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61  ble that externa
328b0 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20  l processes.    
328c0 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20      ** may have 
328d0 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61  truncated the da
328e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
328f0 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74  then extended it
32900 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a   back.        **
32910 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
32920 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73   size while this
32930 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74   process was not
32940 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e   holding a lock.
32950 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
32960 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d  his case there m
32970 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72  ay exist a Pager
32980 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68  .pMap mapping th
32990 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  at appears.     
329a0 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20     ** to be the 
329b0 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69  right size but i
329c0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76  s not actually v
329d0 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73  alid. Avoid this
329e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
329f0 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70  ibility by unmap
32a00 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65  ping the db here
32a10 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
32a20 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
32a30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
32a40 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
32a50 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
32a60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32a70 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
32a80 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
32a90 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
32aa0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
32ab0 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
32ac0 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
32ad0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
32ae0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
32af0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
32b00 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
32b10 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
32b20 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
32b30 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
32b40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
32b50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32b60 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
32b70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
32b80 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
32b90 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32ba0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
32bb0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
32bc0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
32bd0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
32be0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
32bf0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
32c00 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32c10 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
32c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
32c30 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
32c40 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
32c50 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
32c60 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
32c70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32c80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
32c90 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
32ca0 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
32cb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
32cc0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32cd0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
32ce0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
32cf0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
32d00 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
32d10 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
32d20 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
32d30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
32d50 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
32d60 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
32d70 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
32d80 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
32d90 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
32da0 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
32db0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
32dc0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
32dd0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
32de0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
32df0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
32e00 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
32e10 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
32e20 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
32e30 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
32e40 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
32e50 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
32e60 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
32e70 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
32e80 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
32e90 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
32ea0 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
32eb0 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
32ec0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
32ed0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
32ee0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
32ef0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
32f00 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
32f10 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65  * Acquire a refe
32f20 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75  rence to page nu
32f30 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67  mber pgno in pag
32f40 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67  er pPager (a pag
32f50 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68  e.** reference h
32f60 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29  as type DbPage*)
32f70 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
32f80 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  ed reference is 
32f90 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
32fa0 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73   obtained, it is
32fb0 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61   copied to *ppPa
32fc0 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ge and SQLITE_OK
32fd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
32fe0 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
32ff0 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  d page is alread
33000 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  y in the cache, 
33010 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  it is returned. 
33020 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
33030 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
33040 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
33050 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
33060 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72   data.** read fr
33070 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
33080 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61  file. In some ca
33090 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20  ses, the pcache 
330a0 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68  module may.** ch
330b0 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f  oose not to allo
330c0 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
330d0 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72  object and may r
330e0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
330f0 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20  .** object with 
33100 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
33110 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a  eferences..**.**
33120 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
33130 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
33140 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
33150 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
33160 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20  s the .** first 
33170 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
33180 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
33190 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72  y. If the page r
331a0 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20  equested is .** 
331b0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
331c0 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66  ache when this f
331d0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
331e0 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72  d, then the extr
331f0 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66  a.** data is lef
33200 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e  t as it was when
33210 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74   the page object
33220 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a   was last used..
33230 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
33240 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73  abase image is s
33250 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
33260 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f  requested page o
33270 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a  r if a .** non-z
33280 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73  ero value is pas
33290 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e  sed as the noCon
332a0 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61  tent parameter a
332b0 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
332c0 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
332d0 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
332e0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
332f0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
33300 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
33310 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
33320 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
33330 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
33340 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
33350 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
33360 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
33370 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
33380 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
33390 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
333a0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
333b0 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
333c0 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63  occurs in two sc
333d0 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
333e0 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67   a) When reading
333f0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
33400 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  f page from the 
33410 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a  database, and.**
33420 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20  .**   b) When a 
33430 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69  savepoint is bei
33440 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  ng rolled back a
33450 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f  nd we need to lo
33460 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77  ad.**      a new
33470 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63   page into the c
33480 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65  ache to be fille
33490 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20  d with the data 
334a0 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f  read.**      fro
334b0 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  m the savepoint 
334c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
334d0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
334e0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
334f0 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a  ta returned is z
33500 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66  eroed instead of
33510 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66  .** being read f
33520 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33530 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
33540 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70  the bits corresp
33550 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e  onding.** to pgn
33560 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  o in Pager.pInJo
33570 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66  urnal (bitvec of
33580 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77   pages already w
33590 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
335a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61   journal file) a
335b0 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65  nd the PagerSave
335c0 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
335d0 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e  nt bitvecs of an
335e0 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f  y open.** savepo
335f0 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68  ints are set. Th
33600 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20  is means if the 
33610 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69  page is made wri
33620 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20  table at any.** 
33630 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
33640 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c  ure, using a cal
33650 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
33660 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f  rWrite(), its co
33670 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e  ntents.** will n
33680 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  ot be journaled.
33690 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a   This saves IO..
336a0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
336b0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
336c0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
336d0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
336e0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
336f0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
33700 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
33710 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
33720 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
33730 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
33740 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
33750 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
33760 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
33770 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
33780 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
33790 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
337a0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
337b0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
337c0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
337d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
337e0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
337f0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
33800 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
33810 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
33820 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
33830 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
33840 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
33850 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
33860 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
33870 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
33880 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
33890 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
338a0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
338b0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
338c0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
338d0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
338e0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
338f0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
33900 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a  qlite3PagerGet(.
33910 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
33920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
33930 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  er open on the d
33940 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33950 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
33960 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33970 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f  mber to fetch */
33980 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61  .  DbPage **ppPa
33990 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ge,    /* Write 
339a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
339b0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
339c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
339d0 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
339e0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  _XXX flags */.){
339f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33a00 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a  TE_OK;.  PgHdr *
33a10 70 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69  pPg = 0;.  u32 i
33a20 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  Frame = 0;      
33a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
33a40 61 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ame to read from
33a50 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63   WAL file */.  c
33a60 6f 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  onst int noConte
33a70 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
33a80 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33a90 54 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20  T);..  /* It is 
33aa0 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
33ab0 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
33ac0 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
33ad0 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
33ae0 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
33af0 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
33b00 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
33b10 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
33b20 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
33b30 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
33b40 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
33b50 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
33b60 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
33b70 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
33b80 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
33b90 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
33ba0 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
33bb0 70 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54  pgno>1 && USEFET
33bc0 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26  CH(pPager).   &&
33bd0 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
33be0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
33bf0 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
33c00 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  _GET_READONLY)).
33c10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
33c20 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50  S_CODEC.   && pP
33c30 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a  ager->xCodec==0.
33c40 23 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f  #endif.  );..  /
33c50 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e  * Optimization n
33c60 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65  ote:  Adding the
33c70 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20   "pgno<=1" term 
33c80 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22  before "pgno==0"
33c90 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77   here.  ** allow
33ca0 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f  s the compiler o
33cb0 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73  ptimizer to reus
33cc0 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
33cd0 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20   the "pgno>1".  
33ce0 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70  ** test in the p
33cf0 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e  revious statemen
33d00 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73  t, and avoid tes
33d10 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20  ting pgno==0 in 
33d20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20  the.  ** common 
33d30 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20  case where pgno 
33d40 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69  is large. */.  i
33d50 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67  f( pgno<=1 && pg
33d60 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
33d70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33d80 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
33d90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
33da0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
33db0 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  DER );.  assert(
33dc0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
33dd0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
33de0 20 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65   assert( noConte
33df0 6e 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b  nt==0 || bMmapOk
33e00 3d 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ==0 );..  assert
33e10 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  ( pPager->hasHel
33e20 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29  dSharedLock==1 )
33e30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
33e40 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
33e50 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
33e60 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65  rn an error imme
33e70 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f  diately. .  ** O
33e80 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73  therwise, reques
33e90 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  t the page from 
33ea0 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72  the PCache layer
33eb0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
33ec0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
33ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
33ee0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
33ef0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
33f00 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70  if( bMmapOk && p
33f10 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
33f20 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
33f30 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
33f40 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
33f50 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65  l, pgno, &iFrame
33f60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
33f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
33f80 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33f90 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  err;.    }..    
33fa0 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
33fb0 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
33fc0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
33fd0 30 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  0;..      rc = s
33fe0 71 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50  qlite3OsFetch(pP
33ff0 61 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20  ager->fd, .     
34000 20 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d       (i64)(pgno-
34010 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
34020 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70  eSize, pPager->p
34030 61 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a  ageSize, &pData.
34040 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
34050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34060 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20  K && pData ){.  
34070 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34080 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52  ->eState>PAGER_R
34090 45 41 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20  EADER ){.       
340a0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
340b0 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
340c0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
340d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
340e0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
340f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41       rc = pagerA
34100 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70 50  cquireMapPage(pP
34110 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74  ager, pgno, pDat
34120 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20  a, &pPg);.      
34130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34140 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
34150 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
34160 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50  (i64)(pgno-1)*pP
34170 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
34180 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
34190 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
341a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  g ){.          a
341b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
341c0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
341d0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
341e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
341f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
34200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34230 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34240 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34250 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20  }.    }..    {. 
34260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61       sqlite3_pca
34270 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
34280 0a 20 20 20 20 20 20 70 42 61 73 65 20 3d 20 73  .      pBase = s
34290 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
342a0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
342b0 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20  e, pgno, 3);.   
342c0 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
342d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
342e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
342f0 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72 2d  chStress(pPager-
34300 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
34310 26 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20  &pBase);.       
34320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34330 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
34340 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34350 20 20 20 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 20 20 20 20 20 20 70  0 ){.          p
34370 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30  Pg = *ppPage = 0
34380 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
34390 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
343a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
343b0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
343c0 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _err;.        }.
343d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
343e0 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
343f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
34400 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
34410 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
34420 61 73 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ase);.      asse
34430 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20  rt( pPg!=0 );.  
34440 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
34450 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34460 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68      /* Either th
34470 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
34480 33 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72  3PcacheFetch() r
34490 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
344a0 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   or the.    ** p
344b0 61 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79  ager was already
344c0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
344d0 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
344e0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
344f0 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50  d..    ** Set pP
34500 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20  g to 0 and jump 
34510 74 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e  to the exception
34520 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20   handler.  */.  
34530 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67    pPg = 0;.    g
34540 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34550 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73  e_err;.  }.  ass
34560 65 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61  ert( pPg==(*ppPa
34570 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
34580 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f   pPg->pgno==pgno
34590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
345a0 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
345b0 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  r || pPg->pPager
345c0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ==0 );..  if( pP
345d0 67 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f  g->pPager && !no
345e0 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f  Content ){.    /
345f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
34600 68 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64  he pcache alread
34610 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e  y contains an in
34620 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f  itialized copy o
34630 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  f.    ** the pag
34640 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  e. Return withou
34650 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20  t further ado.  
34660 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
34670 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50  gno<=PAGER_MAX_P
34680 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47  GNO && pgno!=PAG
34690 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
346a0 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  r) );.    pPager
346b0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
346c0 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72  AT_HIT]++;.    r
346d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
346e0 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ..  }else{.    /
346f0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68  * The pager cach
34700 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20  e has created a 
34710 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f  new page. Its co
34720 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a  ntent needs to .
34730 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61      ** be initia
34740 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20  lized.  */..    
34750 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
34760 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  ager;..    /* Th
34770 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
34780 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
34790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
347a0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
347b0 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65     ** number gre
347c0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
347d0 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f  or the unused lo
347e0 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72  cking-page, is r
347f0 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20  equested. */.   
34800 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
34810 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
34820 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
34830 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
34840 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
34850 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
34860 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34870 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  ire_err;.    }..
34880 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
34890 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
348a0 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
348b0 74 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  t || !isOpen(pPa
348c0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
348d0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
348e0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
348f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34900 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67  _FULL;.        g
34910 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
34920 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  e_err;.      }. 
34930 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65       if( noConte
34940 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nt ){.        /*
34950 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
34960 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
34970 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
34980 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
34990 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d  .        ** It m
349a0 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
349b0 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
349c0 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
349d0 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20  journal a .     
349e0 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20     ** page that 
349f0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
34a00 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20   be journaled.  
34a10 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65  Nevertheless, be
34a20 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a   sure .        *
34a30 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61  * to test the ca
34a40 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f  se where a mallo
34a50 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  c error occurs w
34a60 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73  hile trying to s
34a70 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  et .        ** a
34a80 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65   bit in a bit ve
34a90 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ctor..        */
34aa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34ab0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
34ac0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
34ad0 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
34ae0 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
34af0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
34b00 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
34b10 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
34b20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e  >pInJournal, pgn
34b30 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  o);.          te
34b40 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
34b50 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
34b60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45      }.        TE
34b70 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61  STONLY( rc = ) a
34b80 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
34b90 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e  vecs(pPager, pgn
34ba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  o);.        test
34bb0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
34bc0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34bd0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
34be0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
34bf0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
34c00 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
34c10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34c20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
34c30 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
34c40 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
34c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34c60 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
34c70 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 62 4d  al(pPager) && bM
34c80 6d 61 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  mapOk==0 ){.    
34c90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34ca0 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
34cb0 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
34cc0 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20   &iFrame);.     
34cd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34ce0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
34cf0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
34d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
34d10 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
34d20 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
34d30 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
34d40 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
34d50 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
34d60 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69  eadDbPage(pPg, i
34d70 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
34d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34d90 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
34da0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34db0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
34dc0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
34dd0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
34de0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
34df0 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63  TE_OK;..pager_ac
34e00 71 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73  quire_err:.  ass
34e10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
34e20 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20  OK );.  if( pPg 
34e30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
34e40 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
34e50 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b   }.  pagerUnlock
34e60 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
34e70 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  ;..  *ppPage = 0
34e80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
34e90 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
34ea0 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
34eb0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
34ec0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
34ed0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
34ee0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
34ef0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
34f00 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
34f10 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
34f20 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
34f30 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53   cache. .**.** S
34f40 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
34f50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20  agerGet().  The 
34f60 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
34f70 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
34f80 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  ** and sqlite3Pa
34f90 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74  gerGet() is that
34fa0 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
34fb0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
34fc0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
34fd0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
34fe0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
34ff0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
35000 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
35010 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
35020 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
35030 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
35040 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
35050 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
35060 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69  .*/.DbPage *sqli
35070 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50  te3PagerLookup(P
35080 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
35090 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 73 71 6c 69  no pgno){.  sqli
350a0 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
350b0 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  *pPage;.  assert
350c0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
350d0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
350e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
350f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30  ager->pPCache!=0
35100 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 73 71   );.  pPage = sq
35110 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35120 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35130 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 61 73  , pgno, 0);.  as
35140 73 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c  sert( pPage==0 |
35150 7c 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c  | pPager->hasHel
35160 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 3b 0a 20  dSharedLock );. 
35170 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 29 20   if( pPage==0 ) 
35180 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
35190 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
351a0 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
351b0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
351c0 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  o, pPage);.}../*
351d0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
351e0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
351f0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
35200 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
35210 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
35220 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
35230 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
35240 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
35250 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
35260 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
35270 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
35280 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
35290 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
352a0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
352b0 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
352c0 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
352d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
352e0 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65 20 2a 70  otNull(DbPage *p
352f0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
35300 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
35310 70 50 67 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  pPg!=0 );.  pPag
35320 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
35330 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  ;.  if( pPg->fla
35340 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
35350 29 7b 0a 20 20 20 20 70 61 67 65 72 52 65 6c 65  ){.    pagerRele
35360 61 73 65 4d 61 70 50 61 67 65 28 70 50 67 29 3b  aseMapPage(pPg);
35370 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
35380 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
35390 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  se(pPg);.  }.  p
353a0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
353b0 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 76 6f  ed(pPager);.}.vo
353c0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
353d0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
353e0 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 20 73  ){.  if( pPg ) s
353f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
35400 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 7d 0a  NotNull(pPg);.}.
35410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
35420 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
35430 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
35440 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
35450 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
35460 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
35470 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
35480 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
35490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
354a0 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
354b0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
354c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
354d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
354e0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
354f0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
35500 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
35510 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
35520 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
35530 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
35540 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
35550 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
35560 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
35570 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
35580 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
35590 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
355a0 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
355b0 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
355c0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
355d0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
355e0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
355f0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
35600 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
35610 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
35620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
35630 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
35640 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
35650 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
35660 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
35670 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
35680 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
35690 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
356a0 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
356b0 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
356c0 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
356d0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
356e0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
356f0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
35700 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
35710 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
35720 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
35730 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
35740 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
35750 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
35760 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
35770 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
35780 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
35790 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
357a0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
357b0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
357c0 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
357d0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
357e0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
357f0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
35800 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
35810 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
35820 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
35830 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
35840 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
35850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35860 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35870 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
35880 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
35890 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
358a0 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
358b0 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
358c0 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
358d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
358e0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
358f0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
35900 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
35910 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
35920 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35930 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35940 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
35950 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
35960 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
35970 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
35980 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
35990 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
359a0 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
359b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
359c0 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
359d0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
359e0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
359f0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
35a00 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
35a10 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
35a20 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
35a30 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
35a40 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
35a50 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
35a60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
35a70 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
35a80 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
35a90 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
35aa0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
35ab0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
35ac0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
35ad0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
35ae0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
35af0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
35b00 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
35b10 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
35b20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
35b30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
35b40 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35b50 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
35b60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
35b70 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
35b80 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
35b90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
35ba0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
35bb0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
35bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35bd0 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
35be0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
35bf0 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
35c00 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
35c10 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
35c20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
35c30 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
35c40 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
35c50 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
35c60 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
35c70 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
35c80 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
35c90 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
35ca0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
35cb0 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35cc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
35cd0 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
35ce0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  );..        /* V
35cf0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
35d00 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61  atabase still ha
35d10 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
35d20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20  as it did when. 
35d30 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73         ** it was
35d40 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
35d50 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ed. */.        r
35d60 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e  c = databaseIsUn
35d70 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20  moved(pPager);. 
35d80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64  QLITE_OK ){.#ifd
35da0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35db0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
35dc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35dd0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
35de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35df0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35e00 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35e10 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
35e20 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
35e30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23  ).          );.#
35e40 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
35e50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
35e60 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
35e70 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35e80 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
35e90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
35ea0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35eb0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35ec0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
35ed0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
35ee0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
35ef0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
35f00 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
35f10 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
35f20 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
35f30 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
35f40 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
35f50 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
35f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
35f80 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
35f90 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
35fa0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
35fb0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
35fc0 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
35fd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35fe0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
35ff0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
36000 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
36010 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
36020 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
36030 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
36040 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
36050 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
36060 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
36070 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
36080 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
36090 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
360a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
360b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
360c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
360d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
360e0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
360f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
36100 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
36110 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
36120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36130 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
36140 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
36150 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
36160 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
36170 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
36180 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
36190 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
361a0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
361b0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
361c0 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
361d0 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
361e0 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
361f0 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
36200 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
36210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36220 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
36230 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
36240 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
36250 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
36260 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
36270 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
36280 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
36290 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
362a0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
362b0 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
362c0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
362d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
362e0 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
362f0 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
36300 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
36310 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
36320 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
36330 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
36340 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
36350 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36360 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
36370 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
36380 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
36390 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
363a0 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
363b0 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
363c0 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
363d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
363e0 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
363f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
36400 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
36410 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
36420 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
36430 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
36440 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
36450 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
36460 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
36470 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
36480 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
36490 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
364a0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
364b0 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
364c0 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
364d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
364e0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
364f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
36500 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36510 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
36520 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36530 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
36540 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
36550 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
36560 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
36570 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
36580 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
36590 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
365a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
365b0 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
365c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
365d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
365e0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
365f0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
36600 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
36610 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
36620 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
36630 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
36640 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
36650 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
36660 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36670 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
36680 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
36690 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
366a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
366b0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
366c0 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
366d0 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
366e0 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
366f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36700 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
36710 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36720 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36730 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
36750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36760 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
36770 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
36780 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
36790 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
367a0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
367b0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
367c0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
367d0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
367e0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
367f0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
36800 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
36810 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
36820 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
36830 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
36840 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
36850 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
36860 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
36870 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
36880 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
36890 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
368a0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
368b0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
368c0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
368d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
368e0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
368f0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
36900 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
36910 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
36920 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
36930 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36940 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
36950 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
36960 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
36970 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
36980 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
36990 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
369a0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
369b0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
369c0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
369d0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
369e0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
369f0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
36a00 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
36a10 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
36a20 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
36a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
36a40 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
36a50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
36a60 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
36a70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
36a80 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
36a90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
36aa0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
36ab0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36ac0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
36ad0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
36ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36af0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
36b00 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
36b10 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
36b20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
36b30 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
36b40 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
36b50 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
36b60 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
36b70 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
36b80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
36b90 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
36ba0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
36bb0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
36bc0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
36bd0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
36be0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
36bf0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
36c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
36c10 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
36c20 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36c30 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
36c40 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
36c50 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
36c60 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
36c70 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
36c80 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
36c90 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
36ca0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36cb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
36cc0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
36cd0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
36ce0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
36cf0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36d00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36d10 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
36d20 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36d30 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
36d40 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
36d50 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36d60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36d70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
36d80 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
36d90 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36da0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36db0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
36dc0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
36dd0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
36de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36df0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
36e00 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
36e10 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
36e20 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
36e30 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
36e40 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
36e50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
36e60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36e70 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61  ../*.** Write pa
36e80 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20  ge pPg onto the 
36e90 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  end of the rollb
36ea0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
36eb0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
36ec0 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
36ed0 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63  AddPageToRollbac
36ee0 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  kJournal(PgHdr *
36ef0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
36f00 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36f10 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
36f20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68   u32 cksum;.  ch
36f30 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36  ar *pData2;.  i6
36f40 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
36f50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
36f60 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
36f70 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
36f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
36f90 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20   page that.  ** 
36fa0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
36fb0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
36fc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
36fd0 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a  rt verifies.  **
36fe0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
36ff0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
37000 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
37010 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
37020 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
37030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
37040 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
37050 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28  Off );.  CODEC2(
37060 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
37070 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
37080 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
37090 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
370a0 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d 20 70  a2);.  cksum = p
370b0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
370c0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
370d0 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61  ..  /* Even if a
370e0 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c  n IO or diskfull
370f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
37100 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  ile journalling 
37110 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
37120 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
37130 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
37140 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
37150 20 70 61 67 65 2e 0a 20 20 2a 2a 20 4f 74 68 65   page..  ** Othe
37160 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
37170 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
37180 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
37190 6c 6f 67 69 63 20 69 6e 0a 20 20 2a 2a 20 70 6c  logic in.  ** pl
371a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
371b0 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
371c0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
371d0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
371e0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
371f0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
37200 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
37210 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
37220 20 73 6f 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63   so,.  ** then c
37230 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f  orruption may fo
37240 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  llow..  */.  pPg
37250 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
37260 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 72  _NEED_SYNC;..  r
37270 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
37280 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66  pPager->jfd, iOf
37290 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  f, pPg->pgno);. 
372a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
372b0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
372c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
372d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
372e0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
372f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f 66  r->pageSize, iOf
37300 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
37310 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
37320 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 77 72  rn rc;.  rc = wr
37330 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
37340 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
37350 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
37360 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
37370 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
37380 74 75 72 6e 20 72 63 3b 0a 0a 20 20 49 4f 54 52  turn rc;..  IOTR
37390 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
373a0 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
373b0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
373c0 0a 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67  .           pPag
373d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
373e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
373f0 29 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  ));.  PAGER_INCR
37400 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
37410 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
37420 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
37430 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
37440 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
37450 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
37460 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
37470 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
37480 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
37490 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
374a0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
374b0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
374c0 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
374d0 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
374e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
374f0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
37500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37510 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
37520 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  0 );.  rc = sqli
37530 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
37540 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
37550 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74   pPg->pgno);.  t
37560 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
37570 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 61  ITE_NOMEM );.  a
37580 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37590 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
375a0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 63  TE_NOMEM );.  rc
375b0 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
375c0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
375d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
375e0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
375f0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
37600 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
37610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37620 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
37630 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
37640 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
37650 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
37660 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
37670 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
37680 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
37690 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
376a0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
376b0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
376c0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
376d0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
376e0 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
376f0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
37700 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
37710 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
37720 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
37730 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
37740 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
37750 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
37760 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
37770 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
37780 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
37790 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
377a0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
377b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54  LITE_OK;..  /* T
377c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
377d0 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73  ot called unless
377e0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
377f0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
37800 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72   .  ** been star
37810 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ted. The journal
37820 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79   file may or may
37830 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20   not be open at 
37840 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
37850 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c   It is never cal
37860 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52  led in the ERROR
37870 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61   state..  */.  a
37880 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
37890 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
378a0 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20  TER_LOCKED.     
378b0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
378c0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
378d0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
378e0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
378f0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37900 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
37910 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37920 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37930 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
37940 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
37950 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
37960 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3d  Pager->readOnly=
37970 3d 30 20 29 3b 0a 20 20 43 48 45 43 4b 5f 50 41  =0 );.  CHECK_PA
37980 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
37990 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
379a0 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
379b0 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
379c0 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
379d0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
379e0 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
379f0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
37a00 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
37a10 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
37a20 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
37a30 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
37a40 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
37a50 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
37a60 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
37a70 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
37a80 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
37a90 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
37aa0 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
37ab0 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
37ac0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
37ad0 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
37ae0 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
37af0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
37b00 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
37b10 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
37b20 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
37b30 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
37b40 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
37b50 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
37b60 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
37b70 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
37b80 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
37b90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37ba0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37bb0 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
37bc0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
37bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
37be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37bf0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
37c00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37c10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
37c20 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37c40 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37c50 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
37c60 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
37c70 74 68 61 74 20 69 73 20 61 62 6f 75 74 20 74 6f  that is about to
37c80 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20   be modified as 
37c90 64 69 72 74 79 2e 20 2a 2f 0a 20 20 73 71 6c 69  dirty. */.  sqli
37ca0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
37cb0 74 79 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  ty(pPg);..  /* I
37cc0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  f a rollback jou
37cd0 72 6e 61 6c 20 69 73 20 69 6e 20 75 73 65 2c 20  rnal is in use, 
37ce0 74 68 65 6d 20 6d 61 6b 65 20 73 75 72 65 20 74  them make sure t
37cf0 68 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20  he page that is 
37d00 61 62 6f 75 74 0a 20 20 2a 2a 20 74 6f 20 63 68  about.  ** to ch
37d10 61 6e 67 65 20 69 73 20 69 6e 20 74 68 65 20 72  ange is in the r
37d20 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
37d30 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 20   or if the page 
37d40 69 73 20 61 20 6e 65 77 20 70 61 67 65 20 6f 66  is a new page of
37d50 66 0a 20 20 2a 2a 20 74 68 65 6e 20 65 6e 64 20  f.  ** then end 
37d60 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 6d 61 6b  of the file, mak
37d70 65 20 73 75 72 65 20 69 74 20 69 73 20 6d 61 72  e sure it is mar
37d80 6b 65 64 20 61 73 20 50 47 48 44 52 5f 4e 45 45  ked as PGHDR_NEE
37d90 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f 0a 20 20 61  D_SYNC..  */.  a
37da0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
37db0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 29 20 3d  pInJournal!=0) =
37dc0 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  = isOpen(pPager-
37dd0 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
37de0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37df0 6c 21 3d 30 0a 20 20 20 26 26 20 73 71 6c 69 74  l!=0.   && sqlit
37e00 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
37e10 75 6c 6c 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ull(pPager->pInJ
37e20 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37e30 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 61  o)==0.  ){.    a
37e40 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
37e50 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
37e60 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
37e70 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
37e80 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
37e90 72 63 20 3d 20 70 61 67 65 72 41 64 64 50 61 67  rc = pagerAddPag
37ea0 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e  eToRollbackJourn
37eb0 61 6c 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  al(pPg);.      i
37ec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
37ee0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
37ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37f00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
37f10 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te!=PAGER_WRITER
37f20 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20  _DBMOD ){.      
37f30 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
37f40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
37f60 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45  AGERTRACE(("APPE
37f70 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
37f80 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
37f90 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
37fa0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37fb0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
37fc0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
37fd0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
37fe0 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 7d  C)?1:0)));.    }
37ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
38000 47 48 44 52 5f 44 49 52 54 59 20 62 69 74 20 69  GHDR_DIRTY bit i
38010 73 20 73 65 74 20 61 62 6f 76 65 20 77 68 65 6e  s set above when
38020 20 74 68 65 20 70 61 67 65 20 77 61 73 20 61 64   the page was ad
38030 64 65 64 20 74 6f 20 74 68 65 20 64 69 72 74 79  ded to the dirty
38040 2d 6c 69 73 74 0a 20 20 2a 2a 20 61 6e 64 20 62  -list.  ** and b
38050 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68  efore writing th
38060 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
38070 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
38080 2e 20 20 57 61 69 74 20 75 6e 74 69 6c 20 6e 6f  .  Wait until no
38090 77 2c 0a 20 20 2a 2a 20 61 66 74 65 72 20 74 68  w,.  ** after th
380a0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
380b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6a 6f 75  successfully jou
380c0 72 6e 61 6c 6c 65 64 2c 20 62 65 66 6f 72 65 20  rnalled, before 
380d0 73 65 74 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  setting the.  **
380e0 20 50 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45   PGHDR_WRITEABLE
380f0 20 62 69 74 20 74 68 61 74 20 69 6e 64 69 63 61   bit that indica
38100 74 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  tes that the pag
38110 65 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20  e can be safely 
38120 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20  modified..  */. 
38130 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
38140 47 48 44 52 5f 57 52 49 54 45 41 42 4c 45 3b 0a  GHDR_WRITEABLE;.
38150 20 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73    .  /* If the s
38160 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
38170 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
38180 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
38190 69 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 77 72  it,.  ** then wr
381a0 69 74 65 20 74 68 65 20 70 61 67 65 20 69 6e 74  ite the page int
381b0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
381c0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
381d0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  if( pPager->nSav
381e0 65 70 6f 69 6e 74 3e 30 20 29 7b 0a 20 20 20 20  epoint>0 ){.    
381f0 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50  rc = subjournalP
38200 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70 50  ageIfRequired(pP
38210 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  g);.  }..  /* Up
38220 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
38230 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
38240 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  n. */.  if( pPag
38250 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
38260 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
38270 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
38280 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
38290 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
382a0 2a 20 54 68 69 73 20 69 73 20 61 20 76 61 72 69  * This is a vari
382b0 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 50 61  ant of sqlite3Pa
382c0 67 65 72 57 72 69 74 65 28 29 20 74 68 61 74 20  gerWrite() that 
382d0 72 75 6e 73 20 77 68 65 6e 20 74 68 65 20 73 65  runs when the se
382e0 63 74 6f 72 20 73 69 7a 65 0a 2a 2a 20 69 73 20  ctor size.** is 
382f0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
38300 70 61 67 65 20 73 69 7a 65 2e 20 20 53 51 4c 69  page size.  SQLi
38310 74 65 20 6d 61 6b 65 73 20 74 68 65 20 28 72 65  te makes the (re
38320 61 73 6f 6e 61 62 6c 65 29 20 61 73 73 75 6d 70  asonable) assump
38330 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 61 6c 6c  tion that.** all
38340 20 62 79 74 65 73 20 6f 66 20 61 20 73 65 63 74   bytes of a sect
38350 6f 72 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  or are written t
38360 6f 67 65 74 68 65 72 20 62 79 20 68 61 72 64 77  ogether by hardw
38370 61 72 65 2e 20 20 48 65 6e 63 65 2c 20 61 6c 6c  are.  Hence, all
38380 20 62 79 74 65 73 20 6f 66 0a 2a 2a 20 61 20 73   bytes of.** a s
38390 65 63 74 6f 72 20 6e 65 65 64 20 74 6f 20 62 65  ector need to be
383a0 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 69 6e 20 63   journalled in c
383b0 61 73 65 20 6f 66 20 61 20 70 6f 77 65 72 20 6c  ase of a power l
383c0 6f 73 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  oss in the middl
383d0 65 20 6f 66 0a 2a 2a 20 61 20 77 72 69 74 65 2e  e of.** a write.
383e0 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
383f0 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
38400 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
38410 65 71 75 61 6c 20 74 6f 20 74 68 65 20 70 61 67  equal to the pag
38420 65 20 73 69 7a 65 2c 20 69 6e 20 77 68 69 63 68  e size, in which
38430 0a 2a 2a 20 63 61 73 65 20 70 61 67 65 73 20 63  .** case pages c
38440 61 6e 20 62 65 20 69 6e 64 69 76 69 64 75 61 6c  an be individual
38450 6c 79 20 77 72 69 74 74 65 6e 2e 20 20 54 68 69  ly written.  Thi
38460 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 72  s routine only r
38470 75 6e 73 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  uns in the.** ex
38480 63 65 70 74 69 6f 6e 61 6c 20 63 61 73 65 20 77  ceptional case w
38490 68 65 72 65 20 74 68 65 20 70 61 67 65 20 73 69  here the page si
384a0 7a 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ze is smaller th
384b0 61 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  an the sector si
384c0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  ze..*/.static SQ
384d0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
384e0 74 20 70 61 67 65 72 57 72 69 74 65 4c 61 72 67  t pagerWriteLarg
384f0 65 53 65 63 74 6f 72 28 50 67 48 64 72 20 2a 70  eSector(PgHdr *p
38500 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
38510 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
38520 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
38530 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  de */.  Pgno nPa
38540 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
38550 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
38560 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
38570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
38580 2f 0a 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20  /.  Pgno pg1;   
38590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
385a0 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
385b0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
385c0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
385d0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  */.  int nPage =
385e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
385f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
38600 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
38610 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
38620 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
38630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38640 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
38650 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 53  r */.  int needS
38660 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
38670 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
38680 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
38690 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 20  R_NEED_SYNC */. 
386a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
386b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a   pPg->pPager; /*
386c0 20 54 68 65 20 70 61 67 65 72 20 74 68 61 74 20   The pager that 
386d0 6f 77 6e 73 20 70 50